我已经使用log4j一段时间了。有一件事我从来没有真正理解过,那就是为什么他们建议从类中配置记录器名称。具体来说,我想知道:
- 三个记录器声明有什么区别
- 哪个更好,为什么
- 是否有一种方法允许复制和粘贴日志声明,而不必在某处键入类的名称?为了表现,我更喜欢不使用反射的东西
例如,考虑类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());
因此派生类在日志中有自己的名称,只需声明一次记录器,并且不必在每个类中选择名称。
我的理解是,您可以随心所欲地调用记录器。为它指定类名是确保名称唯一(如果您使用完全限定的名称)以及有意义的东西(这样您就知道在解析日志时要看什么)的一种方法。为此,我会避免使用静态字符串名称,这样您就可以少担心一个细节。