2012-09-18 51 views
7

我有以下類把Logger.info靜態塊

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

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

它是安全的假設,通過我們到達logger.info時,log4j的系統初始化並準備發出日誌?

看來,如果我能夠做一個Logger.getLogger()並取回一個有效的記錄器實例,這意味着Log4j被初始化,對吧?

回答

6

是的。靜態初始化器(即static {}塊和靜態變量的初始分配)按其聲明的順序執行。

log4j的默認初始化依賴於log4j類LogManager中的一個靜態塊,該類被執行一次Logger類被加載,並且在第一次使用之前被加載。這就是你的建築工程的原因。

+0

看來,在使用SLF4j時,不能保證log4j也準備好。 – Timo

+0

@Timo不,它不是,至少不是單獨使用slf4j-api包。你需要一個包含StaticLoggerBinder類的包;例如slf4j-log4j12。 – MaDa

+0

如果你在類路徑上有slf4j-log4j12,那麼它是有保證的嗎? – Timo

0

看到這部分JLS。它講述了當你初始化一個類時會發生什麼。 This部分討論靜態初始器。回答你的問題,然後AFAIK靜態塊按它們發生的順序執行。當你創建一個實例或者訪問它的一個靜態var /方法時,它們將在類被加載時執行。