问题
是否可以使Log4J显示其用于配置的文件的完整路径?
<小时/> 的背景
我和log4j有一种爱恨交织的关系。在好的时候,它很棒但是当它不起作用时,它可能是最难调试的东西之一。我管理应用程序中的所有日志记录。因此,我对日志记录和default initialization procedure defined in the manual.非常熟悉,似乎每隔几周就会记录一次,我花了很多时间来解决这个问题。
这一次,它严重受损。每个地方的每个日志语句都被转储到控制台,我无法弄清楚原因。上周使用我的log4j.xml文件的完全相同的代码库突然使用了一些其他配置。没有任何明显的变化。我唯一的猜测是,一些依赖项已经改变,我怀疑Maven已经下载了一些破坏一切的邪恶JAR。
如果我能找出 Log4J决定在启动时使用哪个配置文件 ,我可以轻松解决这个问题和其他大多数问题。
有没有办法告诉Log4J打印它用于配置的文件?或者,有没有办法打破正在运行的应用程序并使用调试器来回答这个问题(可能使用表达式或通过检查变量)?
答案 0 :(得分:71)
是的,只需将log4j.debug
添加到JVM系统变量即可。例如:
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".
...
有关参考,请参阅the manual和the FAQ。
答案 1 :(得分: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());
答案 2 :(得分:0)
与此相同的log4j 2是在配置文件中设置<Configuration status="trace">
。这将显示加载log4j2配置文件的位置,以及log4j2配置过程的其他内部详细信息。默认情况下,状态记录器级别为WARN,因此您只能在出现问题时看到通知。
如果未正确找到配置文件,您仍可以通过将系统属性org.apache.logging.log4j.simplelog.StatusLogger.level
设置为TRACE
来启用log4j2内部状态记录。