我的项目依赖于一个jar,它(在我需要的其他东西中)包括了许多项目的公共日志配置。我可以更新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.
我想提供选择加入替代文件(例如log4j2-good.xml
)。由于文档中说明环境变量(特别是LOG4J_CONFIGURATION_FILE
)应该优先于log4j2.component.properties
,我似乎可以将log4j2-good.xml
添加到jar中,并且希望选择加入的使用者可以在运行时将LOG4J_CONFIGURATION_FILE
环境变量设置为log4j2-good.xml,log2j2.xml
。
但是,这似乎并不起作用。
我在jar中添加了一个Main类来进行测试,它包含了一些日志语句和这个静态块:
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
所以log4j 2使用了错误的配置,但是我的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'])
}
结果相同。
我错过了什么!
1条答案
按热度按时间nkcskrwz1#
这是2.14.1版(至少)中的confirmed bug。