如何在代码中使用log4j?

时间:2010-11-09 13:46:18

标签: java singleton log4j

我们必须在我们的应用程序中引入日志记录。我们决定使用log4j是一个不错的选择。还有人告诉我们应该使用单例模式来使用log4j,有人可以强调如何以及为什么?

3 个答案:

答案 0 :(得分:6)

在单例模式中,Logger字段对类是静态的:

public class SomeAwesomeClass {

    private static final Logger logger = Logger.getLogger(SomeAwesomeClass.class);

}

另一种方法是让Logger字段为非静态字段(即SomeAwesomeClass的每个实例都包含对Logger的引用):

public class SomeAwesomeClass {

    private final Logger logger = Logger.getLogger(SomeAwesomeClass.class);

}

我不认为你选择哪条路线会有很大的不同,因为我相信Log4j将为Logger的每个实例不断返回相同的SomeAwesomeClass实例。实际上,它只是不必要的对象引用,所以你不妨使用单例模式。

然而,如果您执行以下操作,则非单身人士模式变得必要:

public class SomeAwesomeClass {

    private final Logger logger = Logger.getLogger(getClass());

    public void doSomething() {
        log.info("Doing something");
    }

}

public class AwesomerClass extends SomeAwesomeClass {
}

...后来

SomeAwesomeClass o = new AwesomerClass();
o.doSomething();

在此示例中,logger字段将对应AwesomerClass,而不是SomeAwesomeClass

答案 1 :(得分:5)

如果您是第一次引入日志记录,请使用Logback。将配置文件用作suggested here并将其添加到类路径中。记录将自动配置。

答案 2 :(得分:2)

Singleton有时候更可取的原因是我们只想要一个Logger 每个应用程序的实例,否则,对于记录器的每个新实例,都会有一个新创建的文件或覆盖现有日志文件。

关于Log4J是否是一个好的选择将取决于您对不同记录器的研究/经验。这完全取决于您的偏好(我一直使用Log4J,因为我发现它更容易配置,但我不会偏向任何记录器)。

有名的有:

  • Log4J的
  • SLF4J
  • 的logback
  • Java自己的Logging ....

网络上有一些示例向您展示如何使用记录器。 Here是Log4J与SLF4J的简要比较。