log4j - 配置记录器名称

log4j - Configuring logger name

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

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

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

我已经阅读了文档,并且在 log4j 站点上看到了对第一种和第二种形式的引用,但我不明白有什么好处。

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

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

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

所以派生的classes在日志中得到自己的名字,你只声明记录器一次,你不会被迫在每个class.

中选择一个名字

回答您的每个问题:

  • What is the difference the three logger declarations?

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

  • Which is better and why?

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

  • Is there a method that allows copy and paste log declaration without having to type the name of the class somewhere? I'd prefer something that didn't use reflection for performance sake.

    如果你使用Eclipse,你可以使用模板。参见 Create Log4J logger or Simple Log4J eclipse template。其他 IDE 也有类似的设施。

使用 class 名称作为记录器名称是一种惯例,现在可能被认为是 "best practice"。原因很简单——过滤。

在 Log4j 中,您配置的记录器与您的应用程序获得的记录器相匹配。因此,如果您有 class 使记录器命名为

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

您可以在某个级别为 "com.mycorp.package1" 配置一个记录器,并将所有这些 class 路由到一组附加程序,而 "com.mycorp.package2" 可以设置为不同的日志记录级别,并且路由到其他地方。

Log4j2 并不真正关心这些是完全限定的 class 名称 - 任何由“.”分隔的名称字符将起作用。

仅供参考 - LogManager.getLogger() 将 return 您使用调用名称 class 的记录器。是的,它使用了反射,但是如果你声明 Logger 是静态的,它只需要初始化一次。