使用log4j,如何找出当前使用的logConfigurator文件的名称和路径,使用PropertyConfigurator.configureAndWatch方法重置文件名,该方法需要此文件的名称和路径看看它是否已经改变。
API文档向我展示了如何配置log4j以重新加载配置,但我找不到一种方法来查看自动获取的文件名和路径。 应用程序独立运行任何应用程序服务器。
感谢。
答案 0 :(得分:24)
我担心您没有机会从API中获取自动拾取的路径。据我了解log4j的源代码,检测到的路径将被使用而不会被存储。
至少你可以使用-Dlog4j.debug
属性在启动时输出log4j内部调试信息,你会得到一些这样的信息:
log4j: Trying to find [log4j.xml] using context classloader sun.misc.Launcher$AppClassLoader@11b86e7.
log4j: Using URL [file:/C:/develop/workspace/foobar/target/classes/log4j.xml] for automatic log4j configuration.
log4j: Preferred configurator class: org.apache.log4j.xml.DOMConfigurator
'log4j: Using URL ...'
行来自LogManager类。您可以从此处检查初始化过程。我看到的URL不会存储以供日后使用。
答案 1 :(得分:2)
您可以在LogManager类的静态初始化中使用与log4j相同的过程。请注意其他初始化和外部配置,例如来自Spring的org.springframework.web.util.Log4jConfigListener
。
public static URL getLog4jConfig() {
String override = OptionConverter.getSystemProperty("log4j.defaultInitOverride", null);
if (override == null || "false".equalsIgnoreCase(override)) {
String configurationOptionStr = OptionConverter.getSystemProperty("log4j.configuration", null);
URL url;
if (configurationOptionStr == null) {
url = Loader.getResource("log4j.xml");
if (url == null) {
url = Loader.getResource("log4j.properties");
}
} else {
try {
url = new URL(configurationOptionStr);
} catch (MalformedURLException ex) {
url = Loader.getResource(configurationOptionStr);
}
}
return url;
} else {
return null;
}
}