是否有可能使log4j显示它用于配置自己的文件?

时间:2010-09-20 15:26:02

标签: java log4j

问题

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

<小时/> 的背景

我和log4j有一种爱恨交织的关系。在好的时候,它很棒但是当它不起作用时,它可能是最难调试的东西之一。我管理应用程序中的所有日志记录。因此,我对日志记录和default initialization procedure defined in the manual.非常熟悉,似乎每隔几周就会记录一次,我花了很多时间来解决这个问题。

这一次,它严重受损。每个地方的每个日志语句都被转储到控制台,我无法弄清楚原因。上周使用我的log4j.xml文件的完全相同的代码库突然使用了一些其他配置。没有任何明显的变化。我唯一的猜测是,一些依赖项已经改变,我怀疑Maven已经下载了一些破坏一切的邪恶JAR。

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

<小时/> 的摘要

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

3 个答案:

答案 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 manualthe 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内部状态记录。