2012-09-18 24 views
7

Tôi đã lớp sauĐưa Logger.info trong khối tĩnh

public class MyClass 
{ 
    private static final Logger logger = Logger.getLogger(MyClass.class); 

    static 
    { 
     logger.info("some text"); 
    } 
} 

Có an toàn khi cho rằng vào thời điểm chúng ta đạt logger.info, hệ thống log4j được khởi tạo và đã sẵn sàng để phát ra các bản ghi?

Dường như nếu tôi có thể thực hiện Logger.getLogger() và lấy lại bản sao Logger hợp lệ, điều đó có nghĩa là Log4j được khởi tạo, phải không?

Trả lời

6

Vâng, đúng vậy. Các trình khởi tạo tĩnh (tức là, cả hai khối static {} và các phép gán ban đầu cho các biến tĩnh) được thực hiện theo thứ tự mà chúng được khai báo.

Khởi tạo mặc định của log4j dựa trên khối tĩnh trong lớp log4j LogManager được thực thi khi lớp Logger được tải và được tải trước lần sử dụng đầu tiên. Đây là lý do tại sao công trình xây dựng của bạn hoạt động.

+0

Dường như khi sử dụng SLF4j, không đảm bảo rằng log4j cũng đã sẵn sàng. – Timo

+0

@Timo Không, nó không phải, ít nhất là không với gói slf4j-api một mình. Bạn cần một gói với lớp StaticLoggerBinder; ví dụ slf4j-log4j12. – MaDa

+0

Và nếu bạn có slf4j-log4j12 trên classpath thì nó có được đảm bảo không? – Timo

0

Xem phần này của JLS. Nó nói về những gì sẽ xảy ra khi bạn khởi tạo một lớp học. This phần nói về initialisers tĩnh. Trong câu trả lời cho câu hỏi của bạn thì AFAIK các khối tĩnh được thực hiện theo thứ tự chúng xuất hiện. Chúng sẽ được thực thi khi lớp được nạp có thể xảy ra khi bạn tạo một thể hiện của nó hoặc truy cập một var/phương thức tĩnh của nó.

Các vấn đề liên quan