有没有办法弄清楚Log4J从哪里挑选配置文件? 我试图更改我的log4j.xml,并且更改没有反映在Log4j行为中。我删除了log4j.xml,有趣的是,Log4J仍在使用旧的行为。所以它必须选择我的命名空间中可用的一些配置文件。但问题是如何弄清楚哪一个。有没有办法做到这一点?在jar等上有很多不同的依赖项,因此其中一个必须包含一个覆盖我的更改的log4j.xml或log4j.properties。 有什么想法吗?
答案 0 :(得分:7)
运行应用程序时,您可以设置系统属性-Dlog4j.debug
。在这种情况下,log4j将生成调试输出,并告诉您它如何解析log4j.xml的路径,例如:
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
要设置路径显式,请使用系统属性-Dlog4j.configuration=file:c:/pathToFile
,如here所述。
答案 1 :(得分:0)
在FrVaBe中激活his answer建议的-Dlog4j.debug
是一个很好的解决方案。但是,我想在启动时打印或记录位置,而不激活log4j的调试模式。我创建了一个小的util方法,它主要是log4j的默认init例程的副本,它返回配置文件的URL。
也许这对其他人有用:
/**
* Get the URL of the log4j config file. This is mostly copied from org.apache.log4j.LogManager's default init routine.
*
* @return log4j config url
*/
public static URL getLog4JConfigurationUrl(){
/** Search for the properties file log4j.properties in the CLASSPATH. */
String override = OptionConverter.getSystemProperty(LogManager.DEFAULT_INIT_OVERRIDE_KEY, null);
// if there is no default init override, then get the resource
// specified by the user or the default config file.
if (override == null || "false".equalsIgnoreCase(override)){
String configurationOptionStr = OptionConverter.getSystemProperty(LogManager.DEFAULT_CONFIGURATION_KEY, null);
URL url;
// if the user has not specified the log4j.configuration
// property, we search first for the file "log4j.xml" and then
// "log4j.properties"
if (configurationOptionStr == null){
url = Loader.getResource("log4j.xml");
if (url == null){
url = Loader.getResource(LogManager.DEFAULT_CONFIGURATION_FILE);
}
} else {
try {
url = new URL(configurationOptionStr);
} catch (MalformedURLException ex) {
// so, resource is not a URL:
// attempt to get the resource from the class path
url = Loader.getResource(configurationOptionStr);
}
}
if (url == null)
throw new RuntimeException("log4j configuration could not be found!");
return url;
}
throw new RuntimeException("default init is overridden, log4j configuration could not be found!");
}
PS:如果您知道如何向log4j询问其当前使用的配置文件,请告诉我。