Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java log4j-配置记录器名称_Java_Logging_Log4j_Log4j2 - Fatal编程技术网

Java log4j-配置记录器名称

Java log4j-配置记录器名称,java,logging,log4j,log4j2,Java,Logging,Log4j,Log4j2,我已经用了一段时间了。有一件事我从未真正理解,那就是为什么他们建议从类中配置记录器名称。具体而言,我想知道: 三种记录器声明的区别是什么 哪一个更好,为什么 是否有一种方法允许复制和粘贴日志声明,而不必在某处键入类的名称?出于性能考虑,我更喜欢不使用反射的东西 例如,考虑类 MyClass < /代码>。我遇到的三个声明是: final Logger myLogger=LogManager.getLogger(MyClass.class.getName()) final Logger myLo

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

  • 三种记录器声明的区别是什么
  • 哪一个更好,为什么
  • 是否有一种方法允许复制和粘贴日志声明,而不必在某处键入类的名称?出于性能考虑,我更喜欢不使用反射的东西
  • 例如,考虑类<代码> MyClass < /代码>。我遇到的三个声明是:

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

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

    • final Logger myLogger=LogManager.getLogger(“MyClass”)


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

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

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

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

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

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

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

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

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

    在回答您的每个问题时:

    • 三种记录器声明的区别是什么

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

    • 哪一个更好,为什么

      第二条路。它是最短、最不容易出错的

    • 是否有一种方法允许复制和粘贴日志声明,而不必在某处键入类的名称?出于性能考虑,我更喜欢不使用反射的东西

      如果使用Eclipse,则可以使用模板。看到或看到。其他IDE中也存在类似的功能


    回答您的每一个问题:

    • 三种记录器声明的区别是什么

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

    • 哪一个更好,为什么

      第二条路。它是最短、最不容易出错的

    • 是否有一种方法允许复制和粘贴日志声明,而不必在某处键入类的名称?出于性能考虑,我更喜欢不使用反射的东西

      如果使用Eclipse,则可以使用模板。看到或看到。其他IDE中也存在类似的功能


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

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

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

    Log4j2并不真正关心这些是完全限定的类名——任何以“.”字符分隔的名称都可以


    FYI-LogManager.getLogger()将返回一个使用调用类名称的记录器。是的,它使用反射,但如果您将记录器声明为静态,则只需初始化一次。

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

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

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

    Log4j2并不真正关心这些是完全限定的类名——任何以“.”字符分隔的名称都可以


    FYI-LogManager.getLogger()将返回一个使用调用类名称的记录器。是的,它使用反射,但如果您将记录器声明为静态,则只需初始化一次。

    您的意思是指定类名更好,因为IDE会错误检查,其中字符串只是字符串。您的意思是指定类名更好,因为IDE会错误检查,一个字符串就是一个字符串。这种方法似乎很有效。我决定使用getClass().getSimpleName()。这种方法似乎很好用。我决定使用getClass().getSimpleName()。