将Logger.info放在静态块中

时间:2012-09-18 16:56:56

标签: java log4j

我有以下课程

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

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

是否可以安全地假设到达logger.info时,log4j系统已初始化并准备发出日志?

似乎如果我能够执行Logger.getLogger()并返回有效的Logger实例,则意味着Log4j已初始化,对吧?

2 个答案:

答案 0 :(得分:6)

是的,确实如此。静态初始值设定项(即static {}块和静态变量的初始赋值)按声明的顺序执行。

log4j的默认初始化依赖于log4j类LogManager中的静态块,该块在加载Logger类后执行,并在首次使用之前加载。这就是你的建筑工程的原因。

答案 1 :(得分:0)

请参阅JLS的这一部分。它讨论了初始化类时会发生什么。 This部分讨论了静态初始化程序。在回答您的问题时,AFAIK静态块按它们发生的顺序执行。它们将在加载类时执行,这可能在您创建它的实例或访问它的静态var /方法时发生。