Чи можна зробити так, щоб log4j відображав, який файл він використовував для самостійного налаштування?


78

Питання

Чи можна зробити так, щоб Log4J відображав повний шлях до файлу, який він використовував для конфігурації?


Передумови

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

Цього разу він сильно поламаний. Кожен окремий оператор журналу скрізь скидається на консоль, і я не можу зрозуміти, чому. Точно така ж база коду, яка використовувала мої файли log4j.xml минулого тижня, раптом використовує якусь іншу конфігурацію. Нічого очевидного не змінилося. Єдине, що я здогадуюсь, змінилося кілька залежностей, і я підозрюю, що Maven завантажив якийсь злий JAR, який порушує все.

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


Резюме

Чи є спосіб сказати Log4J надрукувати, який файл він використовував для конфігурації? Як варіант, чи є спосіб зламати запущений додаток і використати налагоджувач для відповіді на це запитання (можливо, виразом або перевіркою змінних)?


1
Фон звучить як проблема багаторазового прив'язки. З slf4j.org/codes.html#multiple_bindings : Попередження, яке видає SLF4J, є саме цим, попередженням. Навіть коли присутні кілька прив'язок, SLF4J вибере один фреймворк / реалізацію ведення журналу та зв'яжеться з ним. Спосіб вибору прив'язки SLF4J визначається JVM, і для всіх практичних цілей його слід вважати випадковим.
ньюр

Відповіді:


82

Так, просто додайте 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".  
...

Для довідки див . Посібник та поширені запитання .


6
З якоїсь причини встановлення цього прапора не має жодного ефекту в моєму проекті, можливо тому, що він використовує SLF4J. Я намагався дізнатись чому, але врешті закінчив перевірку вручну 21 конфігураційного файлу, який там є;)
рядок

2
Зверніть увагу, що в log4j2 властивість змінилася на log4j2.debug, і вам також може знадобитися встановити -Dorg.apache.logging.log4j.simplelog.StatusLogger.level = TRACE, якщо ви намагаєтеся налагодити проблеми з пошуком конфігураційного файлу.
user2163960

7

Я використовую 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());

1
З одного боку, це було саме те, що я шукав, з іншого боку, зміна конфігураційного файлу з виводу не мала ніякого ефекту. Тож треба бути справді справді впевненим, що Log4J2 насправді використовується. У мене була проблема з кількома прив'язками - як описано тут slf4j.org/codes.html#multiple_bindings - тому фактичний реєстратор був простим slf4j.
ньюр

Я також використовував налагоджувач і встановив точку зупинки на конструкторі org.apache.logging.log4j.util.PropertiesUtil. Тут знаходяться та завантажуються файли з іменем log4j2.component.properties. Я виявив, що два файли були завантажені, перший з цільових / тестових класів, а другий з цільових / класів, і властивість останнього перезаписувало властивість з першого.
rychu

2

Еквівалент log4j 2 для цього має бути встановлений <Configuration status="trace">у файлі конфігурації. Тут відображатиметься місце, звідки завантажується файл конфігурації log4j2, а також інші внутрішні деталі процесу конфігурації log4j2. За замовчуванням рівень реєстратора стану - ПОПЕРЕДЖЕННЯ, тому сповіщення ви бачите лише тоді, коли виникає проблема.

Якщо файл конфігурації знайдено неправильно, ви все одно можете ввімкнути реєстрацію внутрішнього стану log4j2, встановивши системну властивість org.apache.logging.log4j.simplelog.StatusLogger.levelна TRACE.


5
Але якщо ви намагаєтесь з’ясувати, яке значення конфігурації використовується, додавши, що значення конфігурації, яке може бути неактивним, не принесе користі!
Омаха
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.