Есть ли способ выяснить, откуда Log4J выбирает файл конфигурации? Я попытался изменить свой log4j.xml, но изменения не отразились на поведении Log4j. Я удалил log4j.xml и, как ни странно, Log4J все еще работает со старым поведением. Поэтому он должен выбирать какой-то файл конфигурации, доступный в моем пространстве имен. Но вопрос в том, как я могу понять, какой именно. Есть ли способ сделать это? существует так много разных зависимостей от банок и т. д., поэтому одна из них должна содержать log4j.xml или log4j.properties, которые переопределяют мои изменения. Есть идеи?
Как я могу узнать, откуда Log4j выбирает свою конфигурацию?
Ответы (2)
При запуске вашего приложения вы можете установить системное свойство -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
, как описано здесь.
Активация -Dlog4j.debug
, как предложено FrVaBe в его ответ - хорошее решение. Однако я хотел распечатать или зарегистрировать местоположение при запуске, не активируя режим отладки log4j. Я создал небольшой служебный метод, который в основном является копией стандартной процедуры инициализации log4j, которая возвращает 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 используемый в настоящее время файл конфигурации, дайте мне знать.