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

Log4j: несколько регистраторов, уровней и добавок

У меня возникают проблемы с дублирующимися сообщениями журнала при записи в несколько файлов журнала с помощью log4j.

В настоящее время я пытаюсь записать данные уровня INFO (и вверх) для конкретного регистратора с именем foobar в моем foo.log файле, а затем все сообщения журнала уровня WARN (и вверх ) для всех регистраторов в файле bar.log.

В результате этого дубликаты сообщений журнала были записаны в файл foo.log (каждая строка была записана дважды), и после некоторого быстрого исследования я обнаружил, что предложение исправить это было добавить log4j.additivity.foobar=false в файл свойств.

Проблема заключается в том, что, хотя он останавливает повторяющиеся строки, сообщение WARN из регистратора foobar никогда не записывается в файл bar.log.

Мой файл свойств log4j выглядит следующим образом:

log4j.rootLogger = WARN, FOO, BAR
log4j.logger.foobar = INFO, FOO
log4j.additivity.foobar = false

log4j.appender.FOO = org.apache.log4j.RollingFileAppender
log4j.appender.FOO.layout = org.apache.log4j.PatternLayout
log4j.appender.FOO.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n
log4j.appender.FOO.File = foo.log

log4j.appender.BAR = org.apache.log4j.RollingFileAppender
log4j.appender.BAR.layout = org.apache.log4j.PatternLayout
log4j.appender.BAR.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n
log4j.appender.BAR.File = bar.log

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

Обратите внимание, что это упрощенная сводка проблемы. В сценарии реального мира есть несколько регистраторов и более двух файлов журнала

4b9b3361

Ответ 1

Эта проблема может быть решена в двух частях.

1. Предотвращение дублирования сообщений журнала

Сообщения журнала были записаны дважды, потому что мы указали приложение FOO как в rootLogger, так и в категории log4j.logger.foobar. Поэтому мы должны удалить приложение и определить уровень ведения журнала в категории:

log4j.rootLogger = WARN, FOO, BAR
log4j.logger.foobar = INFO

Это означает, что сообщения уровня INFO от log4j.logger.foobar распространяются вверх до ВСЕХ регистраторов appenders в rootLogger, но будет записываться только в каждый файл журнала один раз.

2. Запретить запись уровня INFO в bar.log

Поскольку все сообщения журнала уровня INFO для категории log4j.logger.foobar наследуются приложением в rootLogger, нам нужно остановить BAR appender для записи сообщений уровня INFO.

Мы можем достичь этого, установив свойство Порог в самом приложении BAR:

log4j.appender.BAR.Threshold = WARN

Это предотвратит запись операторов уровня INFO в файл bar.log, поскольку он будет принимать уровни WARN и выше.

Таким образом, полный файл свойств log4j будет выглядеть следующим образом:

log4j.rootLogger = WARN, FOO, BAR
log4j.logger.foobar = INFO

log4j.appender.FOO = org.apache.log4j.RollingFileAppender
log4j.appender.FOO.layout = org.apache.log4j.PatternLayout
log4j.appender.FOO.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n
log4j.appender.FOO.File = foo.log
log4j.appender.FOO.Threshold = INFO

log4j.appender.BAR = org.apache.log4j.RollingFileAppender
log4j.appender.BAR.layout = org.apache.log4j.PatternLayout
log4j.appender.BAR.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n
log4j.appender.BAR.File = bar.log
log4j.appender.BAR.Threshold = WARN