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
) и все еще предотвращать дублирование сообщений журнала?
Обратите внимание, что это упрощенная сводка проблемы. В сценарии реального мира есть несколько регистраторов и более двух файлов журнала
Ответы
Ответ 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