log4j-配置记录器名称



我已经使用log4j一段时间了。有一件事我从来没有真正理解过,那就是为什么他们建议从类中配置记录器名称。具体来说,我想知道:

  1. 三个记录器声明有什么区别
  2. 哪个更好,为什么
  3. 是否有一种方法允许复制和粘贴日志声明,而不必在某处键入类的名称?为了表现,我更喜欢不使用反射的东西

例如,考虑类MyClass。我遇到的三个声明是:

  • final Logger myLogger = LogManager.getLogger(MyClass.class.getName());

  • final Logger myLogger = LogManager.getLogger(MyClass.class);

  • final Logger myLogger = LogManager.getLogger("MyClass");

我读过文档,在log4j网站上看到了对第一个和第二个表单的引用,但我不明白它的优势是什么。

回答您的每个问题:

  • 三个记录器声明有什么区别?

    基本上,使用类型的三种方法中的两种,直接使用或获取名称。第三种方式是任意名称(容易出错),可以与第二种方式匹配。

  • 哪个更好,为什么?

    第二种方式。它是最短和最不容易出错的。

  • 是否有一种方法允许复制和粘贴日志声明,而不必在某处键入类的名称?为了表现,我更喜欢不使用反射的东西。

    如果使用Eclipse,则可以使用模板。请参阅创建Log4J记录器或简单Log4J eclipse模板。类似的设施也存在于其他IDE中。

使用类名作为记录器名称是一种惯例,现在可能被认为是"最佳实践"。原因很简单——过滤。

在Log4j中,您配置的记录器与应用程序获得的记录器相匹配。所以,如果你有一个类,得到名为的记录器

com.mycorp.package1.Class1
com.mycorp.package1.Class2
com.mycorp.package2.Class1
com.mycorp.package2.Class2

您可以在某个级别为"com.mycorp.package1"配置Logger,并将所有这些类路由到一组appenders,而"com.myrp.package2"可以设置为不同的日志记录级别并路由到其他地方。

Log4j2并不真正关心这些是完全限定的类名——任何用"分隔的类名字符将起作用。

仅供参考-LogManager.getLogger()将返回一个使用调用类名称的Logger。是的,它使用反射,但如果您将Logger声明为静态,它只需要初始化一次。

如果我理解了第3点:我通常在父类中声明一个记录器,如下所示:

final Logger myLogger = LogManager.getLogger(getClass());

因此派生类在日志中有自己的名称,只需声明一次记录器,并且不必在每个类中选择名称。

我的理解是,您可以随心所欲地调用记录器。为它指定类名是确保名称唯一(如果您使用完全限定的名称)以及有意义的东西(这样您就知道在解析日志时要看什么)的一种方法。为此,我会避免使用静态字符串名称,这样您就可以少担心一个细节。

最新更新