Подтвердить что ты не робот

Можно ли сделать log4j, какой файл он использовал для настройки?

Вопрос

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


Фон

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

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

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


Резюме

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

4b9b3361

Ответ 1

Да, просто добавьте log4j.debug к системным переменным JVM. Например:

java -Dlog4j.debug -cp ... some.class.name

Log4j затем выведет что-то вроде следующего:

log4j: Trying to find [log4j.xml] using context classloader [email protected]  
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

Я использую 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());

Ответ 3

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

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