Створення декількох файлів журналів різного вмісту за допомогою log4j


81

Чи є спосіб налаштувати log4j так, щоб він виводив різні рівні реєстрації в різні додатки?

Я намагаюся налаштувати кілька файлів журналу. Основний файл журналу охоплює всі повідомлення INFO та вище для всіх класів. (У розробці він буде охоплювати всі повідомлення DEBUG і вище, а TRACE для певних класів.)

Тоді я хотів би мати окремий файл журналу. Цей файл журналу охоплює всі повідомлення DEBUG для певного підмножини класів та ігнорує всі повідомлення для будь-якого іншого класу.

Чи є спосіб отримати те, що я шукаю?

Дякую, Ден

java  log4j 

3
Ви маєте на увазі, що хочете, щоб один файл журналу захоплював DEBUG і лише DEBUG, інший файл журналу - INFO і лише INFO тощо?
Едді,

Відповіді:


70

З цього слід розпочати:

log4j.rootLogger=QuietAppender, LoudAppender, TRACE
# setup A1
log4j.appender.QuietAppender=org.apache.log4j.RollingFileAppender
log4j.appender.QuietAppender.Threshold=INFO
log4j.appender.QuietAppender.File=quiet.log
...


# setup A2
log4j.appender.LoudAppender=org.apache.log4j.RollingFileAppender
log4j.appender.LoudAppender.Threshold=DEBUG
log4j.appender.LoudAppender.File=loud.log
...

log4j.logger.com.yourpackage.yourclazz=TRACE

3
Що робить останній рядок?
djangofan

1
@djangofan встановлює власний рівень журналу пакунків / класів (тобто com.yourpackage.yourclazz із реєстрацією TRACE), хоча в цьому випадку це вже було за замовчуванням (встановлено в рядку 1), тому він нічого не робить. ІМО цей приклад був би кращим, якби rootLogger містив ІНФОРМАЦІЮ, а "вашклас" мав НАЛАДКУВАННЯ.
Том Кліфт,

Параметри першого рядка мають бути TRACE, QuietAppender, LoudAppender, а не QuietAppender, LoudAppender, TRACE
Richard Whitehead

26

Можливо щось подібне?

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
 <!-- general application log -->
 <appender name="MainLogFile" class="org.apache.log4j.FileAppender">
  <param name="File" value="server.log" />
  <param name="Threshold" value="INFO" />
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%-5p %t [%-40.40c] %x - %m%n"/>
  </layout>
 </appender> 
 <!-- additional fooSystem logging -->
 <appender name="FooLogFile" class="org.apache.log4j.FileAppender">
  <param name="File" value="foo.log" />
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%-5p %t [%-40.40c] %x - %m%n"/>
  </layout>
 </appender>
 <!-- foo logging -->
 <logger name="com.example.foo">
  <level value="DEBUG"/>
  <appender-ref ref="FooLogFile"/>
 </logger>
 <!-- default logging -->
 <root>
  <level value="INFO"/>
  <appender-ref ref="MainLogFile"/>
 </root>
</log4j:configuration>

Таким чином, всі інформаційні повідомлення записуються на server.log; навпаки, foo.log містить лише повідомлення com.example.foo, включаючи повідомлення на рівні налагодження.


Com.example.foo - це пакет чи клас?
WowBow

1
@WowBow це може бути будь-яке, але з таким іменем це схоже на пакет. використання назв класів для реєстраторів є просто
умовою

Дякую. Я пробував обидва після того, як попросив і
працюю

7

У мене було це запитання, але з трюком - я намагався реєструвати різний вміст у різних файлах. У мене була інформація про журнал налагодження LowLevel та журнал користувачів HighLevel. Я хотів, щоб LowLevel перейшов лише до одного файлу, а HighLevel - як до файлу, так і до syslogd.

Моє рішення було налаштувати 3 додатки, а потім налаштувати ведення журналу так:

log4j.threshold=ALL
log4j.rootLogger=,LowLogger

log4j.logger.HighLevel=ALL,Syslog,HighLogger
log4j.additivity.HighLevel=false

Мені було важко розібратися в тому, що в 'log4j.logger' може бути перелічено кілька додатків. Я намагався робити це по черзі.

Сподіваюся, це колись допоможе комусь!


3

Для основного журналу / додатка встановіть a, .Threshold = INFOщоб обмежити те, що насправді реєструється в додатку, до INFO і вище, незалежно від того, чи ввімкнено реєстратори DEBUG, TRACE тощо.

Що стосується лову DEBUG і нічого вище цього ... вам, мабуть, доведеться написати власний додаток.

Однак я б рекомендував цього не робити, оскільки це схоже на те, що це значно ускладнить пошук та усунення несправностей:

  1. Якщо ваша мета полягає в тому, щоб мати один файл, у якому ви можете шукати щось для усунення несправностей, то розподіл даних журналу між різними файлами буде дратувати - якщо у вас немає дуже регламентованої політики ведення журналу, вам, швидше за все, знадобиться вміст із DEBUG та INFO для мати можливість ефективно простежити виконання проблемного коду.
  2. Продовжуючи реєструвати всі ваші повідомлення про налагодження, ви втрачаєте будь-який приріст продуктивності, який ви зазвичай отримуєте у виробничій системі, відхиливши реєстрацію (шлях) вниз.

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

Ви хочете виключити повідомлення ERROR, WARN, INFO з другого файлу журналу?
matt b

а в XML ви можете додати параметр Threshold таким чином: <appender name = "ERROR_FILE"> <param name = "Threshold" value = "ERROR" /> </appender>
бритва

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.