未应用 Log4j2 环境变量
Log4j2 environment variables are not applied
我的项目依赖于一个 jar,它(除了我需要的其他东西)包括许多项目的通用日志记录配置。我可以更新 jar,但不能破坏与现有消费者的兼容性。罐子包含:
src
|-- main/resources
| |-- log4j2-bad.xml // not actually named `-bad` but a config I want to overwrite for a unique use case without losing the other classes in the jar
| `-- log4j2.component.properties //contents=`log4j2.configurationFile=log4j2-bad.xml,log4j2.xml`
`-- test/resources
`-- log4j.xml // normally the consumer provides their own `log4j2.xml` file.
我想在 src/main/resources
中提供一个可选的替代文件(例如 log4j2-good.xml
)。由于 documentation says 环境变量(特别是 LOG4J_CONFIGURATION_FILE
)应该优先于 log4j2.component.properties
,看来我可以将 log4j2-good.xml
添加到 jar,而消费者想要选择加入可以安排 LOG4J_CONFIGURATION_FILE
环境变量在 运行 时为 log4j2-good.xml,log2j2.xml
。
然而,这似乎不起作用。
我在 jar 中添加了 Main class 以进行测试。它包含一些日志记录语句和这个静态块:
static {
System.out.println("LOG4J_CONFIGURATION_FILE: " + System.getenv().get("LOG4J_CONFIGURATION_FILE"));
}
当我设置 $env:LOG4J_CONFIGURATION_FILE=log4j2-good.xml,log4j2.xml
和 运行 时,我得到:
2021-11-17 21:39:32,091 main DEBUG Apache Log4j Core 2.14.1 initializing configuration org.apache.logging.log4j.core.config.composite.CompositeConfiguration@6ee52dcd [configurations=[XmlConfiguration[location=C:\<snip>\bin\main\log4j2-bad.xml], XmlConfiguration[location=C:\<snip>\bin\test\log4j2.xml]], mergeStrategy=org.apache.logging.log4j.core.config.composite.DefaultMergeStrategy@4493d195, rootNode=null, listeners=[org.apache.logging.log4j.core.LoggerContext@2781e022], pluginPackages=[], pluginManager=org.apache.logging.log4j.core.config.plugins.util.PluginManager@57e1b0c, isShutdownHookEnabled=true, shutdownTimeoutMillis=0, scriptManager=null]
<snip>
LOG4J_CONFIGURATION_FILE: log4j2-good.xml,log4j2.xml
所以 log4j2 使用了错误的配置,但是我的 Main
说环境变量指定了正确的配置。
当我打开 Windows 系统属性并设置系统环境变量时...同样的事情。
当我 运行 一个 gradle 任务时:
task runGoodConfig(type: JavaExec) {
classpath = sourceSets.test.runtimeClasspath
main = 'com.my.sample.Main'
environment(['LOG4J_CONFIGURATION_FILE':'log4j2-good.xml,log4j2.xml'])
}
同样的结果。
我错过了什么!?
这是一个 confirmed bug 版本 2.14.1(至少)。
我的项目依赖于一个 jar,它(除了我需要的其他东西)包括许多项目的通用日志记录配置。我可以更新 jar,但不能破坏与现有消费者的兼容性。罐子包含:
src
|-- main/resources
| |-- log4j2-bad.xml // not actually named `-bad` but a config I want to overwrite for a unique use case without losing the other classes in the jar
| `-- log4j2.component.properties //contents=`log4j2.configurationFile=log4j2-bad.xml,log4j2.xml`
`-- test/resources
`-- log4j.xml // normally the consumer provides their own `log4j2.xml` file.
我想在 src/main/resources
中提供一个可选的替代文件(例如 log4j2-good.xml
)。由于 documentation says 环境变量(特别是 LOG4J_CONFIGURATION_FILE
)应该优先于 log4j2.component.properties
,看来我可以将 log4j2-good.xml
添加到 jar,而消费者想要选择加入可以安排 LOG4J_CONFIGURATION_FILE
环境变量在 运行 时为 log4j2-good.xml,log2j2.xml
。
然而,这似乎不起作用。
我在 jar 中添加了 Main class 以进行测试。它包含一些日志记录语句和这个静态块:
static {
System.out.println("LOG4J_CONFIGURATION_FILE: " + System.getenv().get("LOG4J_CONFIGURATION_FILE"));
}
当我设置 $env:LOG4J_CONFIGURATION_FILE=log4j2-good.xml,log4j2.xml
和 运行 时,我得到:
2021-11-17 21:39:32,091 main DEBUG Apache Log4j Core 2.14.1 initializing configuration org.apache.logging.log4j.core.config.composite.CompositeConfiguration@6ee52dcd [configurations=[XmlConfiguration[location=C:\<snip>\bin\main\log4j2-bad.xml], XmlConfiguration[location=C:\<snip>\bin\test\log4j2.xml]], mergeStrategy=org.apache.logging.log4j.core.config.composite.DefaultMergeStrategy@4493d195, rootNode=null, listeners=[org.apache.logging.log4j.core.LoggerContext@2781e022], pluginPackages=[], pluginManager=org.apache.logging.log4j.core.config.plugins.util.PluginManager@57e1b0c, isShutdownHookEnabled=true, shutdownTimeoutMillis=0, scriptManager=null]
<snip>
LOG4J_CONFIGURATION_FILE: log4j2-good.xml,log4j2.xml
所以 log4j2 使用了错误的配置,但是我的 Main
说环境变量指定了正确的配置。
当我打开 Windows 系统属性并设置系统环境变量时...同样的事情。 当我 运行 一个 gradle 任务时:
task runGoodConfig(type: JavaExec) {
classpath = sourceSets.test.runtimeClasspath
main = 'com.my.sample.Main'
environment(['LOG4J_CONFIGURATION_FILE':'log4j2-good.xml,log4j2.xml'])
}
同样的结果。
我错过了什么!?
这是一个 confirmed bug 版本 2.14.1(至少)。