2012-09-18 39 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 /方法时,它们将在类被加载时执行。