是否可以使log4j显示它用于配置自身的文件?

2022-08-31 11:03:41

问题

是否可以使Log4J显示用于配置的文件的完整路径?


背景

我与log4j有爱恨交织的关系。在经济繁荣时期,它很棒,但是当它不起作用时,它可能是最难调试的事情之一。我管理我们应用程序中的所有日志记录。因此,我非常熟悉日志记录和手册中定义的默认初始化过程。尽管如此,似乎每隔几周,日志记录就会中断,我花了很多时间解决问题。

这一次,它被严重打破了。每个地方的日志语句都被转储到控制台,我不知道为什么。上周使用我的log4j.xml文件的相同代码库突然使用了其他一些配置。没有明显的变化。我唯一的猜测是,一些依赖关系已经改变,我怀疑Maven已经下载了一些邪恶的JAR,破坏了一切。

如果我能弄清楚Log4J决定在启动时使用哪个配置文件,我就可以轻松解决这个问题和大多数其他问题。


总结

有没有办法告诉Log4J打印它用于配置的文件?或者,有没有办法中断正在运行的应用程序并使用调试器来回答这个问题(可能是使用表达式或通过检查变量)?


答案 1

是的,只需添加到 JVM 系统变量中即可。例如:log4j.debug

java -Dlog4j.debug -cp ... some.class.name

然后,Log4j将输出如下内容:

log4j: Trying to find [log4j.xml] using context classloader sun.misc.Launcher$AppClassLoader@1f7182c1.  
log4j: Using URL [file:/C:/Users/matt/workspace/projectname/target/test-classes/log4j.xml] for automatic log4j configuration.  
log4j: Preferred configurator class: org.apache.log4j.xml.DOMConfigurator  
log4j: System property is :null  
log4j: Standard DocumentBuilderFactory search succeded.  
log4j: DocumentBuilderFactory is: org.apache.xerces.jaxp.DocumentBuilderFactoryImpl  
log4j: debug attribute= "null".  
log4j: Ignoring debug attribute.  
log4j: reset attribute= "false".  
log4j: Threshold ="null".  
...

有关参考,请参阅手册常见问题解答


答案 2

我正在使用Log4J2,如果你想从你的Java程序中获取文件,这对我有用:

LoggerContext lContect = LogManager.getContext();
Field f = lContect.getClass().getDeclaredField("configuration");
f.setAccessible(true);
XmlConfiguration iWantThis = (XmlConfiguration) f.get(lContect);
System.out.println("Config File: " + iWantThis.getName());

推荐