我已经使用log4j一段时间了。我从未真正理解的一件事是他们建议从班级配置记录器名称。具体来说,我想知道:
例如,考虑班级MyClass
。我遇到的三个声明是:
final Logger myLogger = LogManager.getLogger(MyClass.class.getName());
final Logger myLogger = LogManager.getLogger(MyClass.class);
final Logger myLogger = LogManager.getLogger("MyClass");
我已经阅读了doc,我在log4j网站上看到了对第一和第二种形式的引用,但我不明白它的优点。
答案 0 :(得分:3)
回答你的每个问题:
三个记录器声明有什么区别?
基本上,您使用类类型的三种方式中的两种,直接或获取名称。第三种方式是任意名称(容易出错),可以与第二种方式相匹配。
哪个更好,为什么?
第二种方式。它是最短且最不容易出错的。
是否有一种方法允许复制和粘贴日志声明而无需在某处键入类的名称?为了性能,我更喜欢没有使用反射的东西。
如果使用Eclipse,则可以使用模板。请参阅Create Log4J logger或Simple Log4J eclipse template。其他IDE中也存在类似的功能。
答案 1 :(得分:2)
使用类名作为记录器名称是一种惯例,现在可能被认为是“最佳实践”。原因很简单 - 过滤。
在Log4j中,您配置的记录器将与您的应用程序获取的记录器进行匹配。因此,如果您的类具有名为
的记录器com.mycorp.package1.Class1
com.mycorp.package1.Class2
com.mycorp.package2.Class1
com.mycorp.package2.Class2
您可以在某个级别为“com.mycorp.package1”配置Logger,并将所有这些类路由到一组appender,而“com.mycorp.package2”可以设置为不同的日志记录级别并在其他位置路由
Log4j2并不关心这些是完全限定的类名 - 由'。'分隔的任何内容。角色会起作用。
FYI - LogManager.getLogger()将返回一个使用调用类名称的Logger。是的,它使用反射但是如果你声明Logger是静态的,它只需要初始化一次。
答案 2 :(得分:1)
如果我理解了第3点:我通常在父类中声明一个记录器,如下所示:
final Logger myLogger = LogManager.getLogger(getClass());
因此派生类在日志中获得自己的名称,只声明一次记录器,并且不必强制在每个类中选择一个名称。
答案 3 :(得分:0)
我的理解是你可以随意调用你的记录器。为它分配类名是一种确保名称是唯一的方法(如果你使用完全限定的名称)以及有意义的东西(所以你知道在解析你的日志时你正在看什么)。为此,我不再使用静态字符串名称,因此您不必担心一个细节。