Where to place log4j.xml

47
如何指定log4j在查找其xml配置文件时要查看的位置?
默认情况下,log4j似乎会查找类文件夹的根目录,我可以通过使用调试log4j功能并从IDE运行我的应用程序来确认这一点。
然而,我的jar包中已经没有任何类文件夹了。而log4j.xml文件位于jar包的根目录。
我已经尝试设置选项-Dlog4j.configuration=log4j.xml,但它不起作用。
以下是我应用程序当前的全局结构:
  • com
  • lib
  • meta-inf
  • log4j.xml

2
当使用log4j 2.0或更高版本时,文件名应为'log4j2.xml'。 - Francois
6个回答

38

它使用CLASSPATH查找log4j.xml配置文件。如果log4j没有找到任何配置文件,它将向控制台发送错误信息。如果您没有看到任何此类错误,则可能是它正在找到一个配置文件,但这个配置文件可能不是您正在编辑的配置文件。有一种命令行选项可以强制Log4J报告其正在使用的配置文件路径。

来自http://wiki.apache.org/logging-log4j/Log4jConfigurationHelp

如果你使用“-Dlog4j.debug”运行,log4j将打印出信息到标准输出,告诉你它如何尝试配置自己。查看那些信息将告诉您它正在寻找哪个配置文件。


Log4j.xml 在我的文件夹根目录下。而且这个文件夹已经包含在我的类路径中。然而,log4j 似乎没有被识别出来... :/ - Farid
我知道这个调试功能,但它似乎没有起作用。日志只是在控制台上打印出来,我看不到任何调试日志。我没有任何错误...我完全迷失了。 - Farid
如果调试参数未使Log4J报告正在加载的配置文件的路径和文件名,我会对应用程序的启动方式感到惊讶。这是通过批处理文件吗?您使用的是什么IDE? - Kelly S. French

24

假设您的log4j配置文件在源代码树之外。如果找不到配置文件,请使用以下命令进行帮助:

-Dlog4j.configuration=file:///your/path/log4j.xml

请注意限定词file:///。没有这个限定词将无法正常工作。


嗨rwst:我想从Tomcat VM参数加载laback.xml,但这没有起作用,你能提供任何建议吗? - Sai prateek
这个答案连同-Dlog4j.debug选项非常适合找出正在发生的事情。 - Ashwin Jayaprakash

8

也许这是一个非常老的问题,但对我来说,答案在官方的Log4j 2文档中:

自动配置

Log4j有能力在初始化期间自动配置自己。当Log4j启动时,它会定位所有的ConfigurationFactory插件,并按权重从高到低排列。Log4j提供了四个ConfigurationFactory实现:JSON、YAML、属性和XML。

  1. Log4j将检查"log4j2.configurationFile"系统属性,如果设置了,则尝试使用与文件扩展名匹配的ConfigurationFactory加载配置。请注意,这不限于本地文件系统上的位置,也可能包含URL。
  2. 如果未设置系统属性,则属性ConfigurationFactory将在类路径中查找log4j2-test.properties
  3. 如果找不到此文件,则YAML ConfigurationFactory将在类路径中查找log4j2-test.yamllog4j2-test.yml
  4. 如果找不到此文件,则JSON ConfigurationFactory将在类路径中查找log4j2-test.jsonlog4j2-test.jsn
  5. 如果找不到此文件,则XML ConfigurationFactory将在类路径中查找log4j2-test.xml
  6. 如果无法找到测试文件,则属性ConfigurationFactory将在类路径中查找log4j2.properties
  7. 如果找不到属性文件,则YAML ConfigurationFactory将在类路径中查找log4j2.yamllog4j2.yml
  8. 如果找不到YAML文件,则JSON ConfigurationFactory将在类路径中查找log4j2.jsonlog4j2.jsn
  9. 如果找不到JSON文件,则XML ConfigurationFactory将尝试在类路径中定位log4j2.xml
  10. 如果无法找到配置文件,则使用DefaultConfiguration。这将导致日志输出到控制台。

2
你知道我能否将一个 .xml 文件放在资源文件夹的子文件夹或嵌套子文件夹中吗?我无法弄清楚如何使用 "log4j.configurationFile" 加载它...... 我只能从根资源文件夹加载它,我做错了什么吗?(备注:#163489028) - ycomp

5

我没有任何错误。

所以log4j已经找到了你的配置,否则你会收到以下提醒:

log4j:WARN No appenders could be found for logger ().
log4j:WARN Please initialize the log4j system properly.

此外:

日志只是在控制台上打印出来。

这意味着你可能需要定义一个文件appender,如FileAppenderRollingFileAppender。在简短介绍的"配置"部分有一些示例。


3

您可以使用:

DOMConfigurator.configure(log4jConfigurationFilename);

如果位置不在根目录下,请指定位置!


-1

不用担心放在哪里。只需运行您的项目,比如在eclipse中,log4j会抛出一个异常,告诉您它正在寻找的位置。然后您可以将其放置在那里。

一旦您使其正常工作,您也会逐渐理解逻辑并学会如何进行更改。


1
在Eclipse中,会抛出一个异常,但它并不会告诉你它正在寻找哪个文件。 - Knoxie
控制台输出显示:“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.” 这并没有什么帮助,很抱歉。 - VinZ
确实,这非常健壮。试一试吧。我将它放在我的IntelliJ Idea项目中的src/main/resources文件夹中,无需任何其他配置。 - OneWorld

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接