我们如何指定 log4j 在尝试查找其 xml 配置文件时必须查看的位置?
默认情况下,log4j 似乎会查找类文件夹的根目录,我可以说使用调试 log4j 功能并从 IDE 运行我的应用程序。
但是,我的 jar 中不再有任何类文件夹。 log4j.xml 文件位于 jar 的根目录下。
我已经尝试设置选项 -Dlog4j.configuration=log4j.xml 但它不起作用。
这是我目前应用程序的全局结构:
它使用 CLASSPATH 查找 log4j.xml。如果 log4j 找不到任何配置文件,它将向控制台发送错误。如果您没有看到任何此类错误,则很可能是它找到了一个配置文件,该文件可能不是您正在编辑的文件。有一个命令行选项可以强制 Log4J 报告它正在使用的配置文件的路径。
来自 http://wiki.apache.org/logging-log4j/Log4jConfigurationHelp
如果您使用“-Dlog4j.debug”运行,那么 log4j 将按照标准打印信息 输出告诉它如何尝试 自行配置。透过那件事看 会告诉你它在哪里寻找 配置文件。
假设您的 log4j 配置位于源代码树之外。如果它找不到您的配置文件,请帮助它:
-Dlog4j.configuration=file:///your/path/log4j.xml
注意限定符 file:///。没有它就行不通。
可能这是一个非常古老的问题,但对我来说答案在官方 Log4j 2 文档中:
自动配置
Log4j 能够在运行过程中自动配置自身 初始化。当 Log4j 启动时,它会找到所有
插件并按加权顺序排列它们 从最高到最低。交付时,Log4j 包含四个ConfigurationFactory
实现:一种用于 JSON,一种用于 YAML,一种用于属性,一种用于 XML。ConfigurationFactory
- Log4j 将检查
系统属性,如果设置,将尝试使用"log4j2.configurationFile"
与文件扩展名匹配。请注意,这 不限于本地文件系统上的某个位置,并且可以 包含一个 URL。ConfigurationFactory
- 如果未设置系统属性,ConfigurationFactory 将查找属性
在类路径中。log4j2-test.properties
- 如果没有找到这样的文件,YAML ConfigurationFactory 将查找
类路径中的或log4j2-test.yaml
。log4j2-test.yml
- 如果没有找到这样的文件,JSON ConfigurationFactory 将查找
类路径中的或log4j2-test.json
。log4j2-test.jsn
- 如果没有找到这样的文件,XML ConfigurationFactory 将查找
在类路径中。log4j2-test.xml
- 如果无法找到测试文件,ConfigurationFactory 属性将在类路径上查找
。log4j2.properties
- 如果找不到属性文件,YAML ConfigurationFactory 将在类路径上查找
或log4j2.yaml
。log4j2.yml
- 如果找不到 YAML 文件,JSON ConfigurationFactory 将在类路径上查找
或log4j2.json
。log4j2.jsn
- 如果无法找到 JSON 文件,XML ConfigurationFactory 将尝试在类路径上查找
。log4j2.xml
- 如果找不到配置文件,将使用
。这将导致日志输出转到控制台。DefaultConfiguration
我没有任何错误
因此 log4j 正在查找您的配置,否则您将得到:
log4j:WARN 找不到记录器 () 的附加程序。
log4j:WARN 请正确初始化 log4j 系统。
还有:
日志只是在控制台打印出来
这意味着您可能需要定义一个文件追加器,例如 FileAppender 或 RollingFileAppender。 简短介绍的“配置”部分有一些示例。
您可以使用:
DOMConfigurator.configure(log4jConfigurationFilename);
如果不是根目录,请指定位置。
不用担心把它放在哪里。只要运行你的项目,比如说在 eclipse 中,log4j 就会抛出一个异常,告诉你它在哪里寻找。然后你就可以把它放在那里。
一旦你让它发挥作用,当你理解逻辑时,你也会弄清楚如何改变它。