Можно ли сделать log4j, какой файл он использовал для настройки?
Вопрос
Возможно ли, чтобы Log4J отображал полный путь к файлу, который он использовал для настройки?
Фон
У меня есть отношения любви-ненависти с log4j. В хорошие времена это здорово, но когда он не работает, это может быть одна из самых сложных вещей для отладки. Я управляю всеми входами в наше приложение. Таким образом, я очень хорошо знаком с протоколированием и процедурой инициализации по умолчанию, определенной в руководстве. Тем не менее, кажется, что каждые несколько недель регистрация перерывы, и я трачу много времени, сортируя проблему.
На этот раз он сильно сломан. Каждый оператор журнала всегда сбрасывается на консоль, и я не могу понять, почему. Такая же точная кодовая база, которая использовала мои файлы log4j.xml на прошлой неделе, внезапно использует другую конфигурацию. Ничего очевидного не изменилось. Мое единственное предположение: несколько зависимостей изменились, и я подозреваю, что Maven загрузил какой-то злой JAR, который разбил все.
Если бы я мог просто определить , какой конфигурационный файл Log4J решил использовать при запуске, я мог бы легко решить эту и большинство других проблем.
Резюме
Можно ли указать Log4J для печати того файла, который он использовал для настройки? Альтернативно, есть ли способ разорвать запущенное приложение и использовать отладчик для ответа на этот вопрос (возможно, с выражением или путем проверки переменных)?
Ответы
Ответ 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
.