2017-10-17 125 views
0

我有一个包中有几个类,在我的项目中有几个包。 对于继承,父类中的这些文件是您需要多久设置一次log4j2的配置文件?

{ // File location for log4j2.xml 
    System.setProperty("log4j.configurationFile", 
     "file:\\\\" + System.getProperty("user.dir") + "\\Properties\\log4j2.xml"); 
} 

然而,我看到ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console. Set system property 'log4j2.debug' to show Log4j2 internal initialization logging.

所以,很显然,一次是不够的。

那么我需要设置log4j.configurationFile的系统属性的一般规则是什么?

  • 每包一次?
  • 每班一次?
  • 每个父母/基类,不管包?
  • 还是别的什么?

对于多个类和包,最佳实践是什么?

回答

3

Log4j 2在初始化时进行配置,即无论何时首次在JVM的实例内创建Logger实例,大约......您的应用程序中声明Logger实例的第一个类会导致Log4j 2初始化自身。所以,这个问题的答案...

你需要多久设置一次log4j2的配置文件?

...是一旦

您的OP中报告的问题:No log4j2 configuration file found. Using default configuration是由于Log4j无法找到您试图指向的配置文件而引起的。这个问题是由于不经常设置配置文件导致的而不是

根据the docs的Log4j将寻找它的配置源如下:

  1. 的Log4j将检查“log4j.configurationFile”系统属性,如果设置,会尝试使用 加载配置与文件扩展名匹配的ConfigurationFactory。
  2. 如果没有设置系统属性,则ConfigurationFactory属性将在类路径中查找log4j2-test.properties。
  3. 如果没有找到这样的文件,YAML ConfigurationFactory将在类路径中查找log4j2-test.yaml或log4j2-test.yml。
  4. 如果找不到这样的文件,JSON ConfigurationFactory将在类路径中查找log4j2-test.json或log4j2-test.jsn。
  5. 如果找不到这样的文件,XML ConfigurationFactory将在类路径中查找log4j2-test.xml。
  6. 如果无法找到测试文件,ConfigurationFactory的属性将在类路径中查找log4j2.properties。
  7. 如果无法找到属性文件,则YAML ConfigurationFactory将在 类路径中查找log4j2.yaml或log4j2.yml。
  8. 如果无法找到YAML文件,JSON ConfigurationFactory将在类路径中查找log4j2.json或log4j2.jsn。
  9. 如果无法找到JSON文件,XML ConfigurationFactory将尝试在类路径中找到log4j2.xml。
  10. 如果找不到配置文件,将使用DefaultConfiguration。这将导致日志记录输出到控制台。

如果您尝试设置log4j.configurationFile成功,那么选择1将从事但是尝试不成功,我们知道这是因为你引用的错误信息告诉我们,Log4j是为通过对选项10下降。

我建议使用-Dlog4j.configurationFile =/path/to/log4j2.xml来运行你的应用程序,或者确保log4j2.xml在你的应用程序的类路径上。抛弃System.setProperty(...)调用您的代码的想法感觉像一个反模式,可能会相当脆弱,因为任何静态记录器之前System.setProperty(...)调用将导致Log4j初始化自己知道您的配置文件位置之前。