Можно ли заставить log4j отображать, какой файл использовался для его настройки? - PullRequest
69 голосов
/ 20 сентября 2010

Вопрос

Можно ли заставить Log4J отображать полный путь к файлу, который он использовал для конфигурации?


Фон

У меня есть отношения любви-ненависти с log4j. В хорошие времена это здорово, но когда это не работает, это может быть одной из самых сложных вещей для отладки. Я управляю всеми входами в наше приложение. Таким образом, я очень хорошо знаком с ведением журналов и процедурой инициализации по умолчанию , определенной в руководстве. Тем не менее, кажется, что каждые несколько недель журналирование прерывается, и я трачу много время разобраться с проблемой.

На этот раз он сильно сломан. Каждый отдельный лог-отчет везде выводится на консоль, и я не могу понять, почему. Та же самая база кода, которая использовала мои файлы log4j.xml на прошлой неделе, внезапно использует какую-то другую конфигурацию. Ничего очевидного не изменилось. Мое единственное предположение, что несколько зависимостей изменились, и я подозреваю, что Maven загрузил какой-то злой JAR, который все ломает.

Если бы я мог просто выяснить , какой файл конфигурации Log4J решил использовать при запуске , я мог бы легко решить эту и большинство других проблем.


Основная информация

Есть ли какой-нибудь способ указать Log4J напечатать, какой файл он использовал для конфигурации? В качестве альтернативы, есть ли способ сломать работающее приложение и использовать отладчик для ответа на этот вопрос (может быть, с помощью выражения или проверки переменных)?

Ответы [ 3 ]

71 голосов
/ 20 сентября 2010

Да, просто добавьте 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 .

2 голосов
/ 18 января 2016

Я использую 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());
0 голосов
/ 19 января 2016

Эквивалентом log4j 2 для этого является установка <Configuration status="trace"> в файле конфигурации. Это покажет местоположение, откуда загружен файл конфигурации log4j2, а также другие внутренние детали процесса конфигурации log4j2. По умолчанию уровень ведения журнала состояния равен WARN, поэтому уведомления отображаются только при наличии проблемы.

Если файл конфигурации не найден правильно, вы все равно можете включить внутреннюю регистрацию состояния log4j2, установив системное свойство org.apache.logging.log4j.simplelog.StatusLogger.level в TRACE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...