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


78

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


背景

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

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

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


概要

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


1
背景听起来像是多重绑定问题。来自slf4j.org/codes.html#multiple_bindings:SLF4J发出的警告就是这样,一个警告。即使存在多个绑定,SLF4J也会选择一个日志记录框架/实现并与其绑定。SLF4J选择绑定的方式由JVM确定,出于所有实际目的,应将其视为随机的。
newur

Answers:


81

是的,只需将其添加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".  
...

有关参考,请参见手册FAQ


6
出于某种原因,设置此标志对我的项目没有任何影响,可能是因为它使用了SLF4J。我试着去了解为什么,但我终于结束了检查都有哪些,还有21手动配置文件;)
在线

2
请注意,在log4j2中,该属性已更改为log4j2.debug,并且如果您尝试调试与查找配置文件有关的问题,则可能还需要设置-Dorg.apache.logging.log4j.simplelog.StatusLogger.level = TRACE。
user2163960

6

我正在使用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());

1
一方面,这正是我要寻找的东西,另一方面,从输出更改配置文件无效。因此,必须真正确定确实使用了Log4J2。我遇到了多重绑定问题-如此处slf4j.org/codes.html#multiple_bindings所述-因此实际的记录器是slf4j-simple。
newur

我也在使用调试器,并在org.apache.logging.log4j.util.PropertiesUtil的构造函数上设置了一个断点。这是名为log4j2.component.properties的文件的定位和加载位置。我发现已经加载了两个文件,第一个是从target / test-classs加载的,第二个是从target / classs加载的,后者的属性是从第一个重写属性。
rychu

2

与此等效的log4j 2将<Configuration status="trace">在配置文件中设置。这将显示从中加载log4j2配置文件的位置,以及log4j2配置过程的其他内部详细信息。默认情况下,状态记录器级别为WARN,因此仅在出现问题时才看到通知。

如果找不到正确的配置文件,您仍然可以通过将system属性设置org.apache.logging.log4j.simplelog.StatusLogger.level为来启用log4j2内部状态日志记录TRACE


5
但是,如果您试图找出正在使用的配置值,则将其添加到可能不活动的配置值中将无济于事!
奥马哈
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.