LOG4J - избегать одного и того же сообщения два раза в журнале - PullRequest
5 голосов
/ 25 января 2012

Вот мой log4j.properties файл

# Set loggers' levels
log4j.rootLogger=warn, trace_file

# Appender
log4j.appender.trace_file=org.apache.log4j.RollingFileAppender
log4j.appender.trace_file.Append=true
log4j.appender.trace_file.File=log/myLog.log
log4j.appender.trace_file.MaxFileSize=10MB
log4j.appender.trace_file.MaxBackupIndex=50

# PatternLayout
log4j.appender.trace_file.layout=org.apache.log4j.PatternLayout
log4j.appender.trace_file.layout.ConversionPattern=%d [%p] (%F:%L) %m%n

# Classes
log4j.logger.my_package=info, trace_file

Что я хочу:

  • Хранить запросы журнала от my.package в trace_file с уровнем не ниже INFO
  • Хранить запросы журналов от всех других регистраторов в trace_file ТОЛЬКО, если это хотя бы WARN уровень

Моя конфигурация не работает.Если my.package поднимает запрос журнала уровня WARN, этот запрос журнала записывается два раза.Если я использую два отдельных приложения, проблем не возникает.

Что мне не хватает?

Ответы [ 6 ]

6 голосов
/ 25 января 2012

Попробуйте удалить директиву trace_file из оператора логгера my_package.

4 голосов
/ 15 августа 2014

Я согласен с Геворгом.Это может быть проблема аддитивности.

Те, кто использует файл log4j.properties:

Добавить log4j.additivity.com.example.package=false. (Замените org.hibernate на любой пакет, который вам нужен)

Те, кто использует конфигурацию на основе log4j.xml:

<logger name="com.example.package" additivity="false">
....
</logger>
4 голосов
/ 25 января 2012

Изменить

log4j.logger.my_package=info, trace_file

на

log4j.logger.my_package=info

По умолчанию наследники добавляются от родительского регистратора, поэтому, указав trace_file для корневого регистратора и my_package, выГоворите это делать дважды.

1 голос
/ 25 января 2012

Это похоже на проблему аддитивности.

Я не знаком с конфигурацией файла свойств, но должна быть опция флага additivity, когда вы определяете регистратор.Установка в false должна решить проблему.Кроме того, используя вместо этого конфигурацию xml, вы можете использовать опцию log4j Filter, которая недоступна в файле свойств.

Это должно быть примерно так: log4j.logger.my_package.additivity = false

Наконец, возьмитепосмотрите на logback , если вы никогда не слышали об этом раньше

1 голос
/ 25 января 2012

Предотвращение аддитивности приложения через:

log4j.additivity.my_package = false

См. http://logging.apache.org/log4j/1.2/manual.html, раздел "Аппендеры и макеты" ..

Цитата:

Аддитивность приложения. Выходные данные оператора журнала регистратора C будут передаваться всем приложениям в C и его предкам.Это значение термина «аддитивность аппендера».

Однако, если у предка логгера C, скажем P, для флага аддитивности установлено значение false, выход C будет направлен всем аппендерам в Cи его предки, включая P, но не добавляющие ни в одном из предков P.

По умолчанию для регистраторов установлен флаг аддитивности.

1 голос
/ 25 января 2012

Вам не хватает роли rootLogger.

Предупреждение от my_package, которое будет перехвачено trace_file через корневого логгера log4j.rootLogger=warn, trace_file, а затем тем же приложителем через log4j.logger.my_package=info, trace_file

Я полагаю, что когда вы создали второго аппендера, вы не указали его для rootLogger, не так ли?

В качестве альтернативы, вы можете изменить только уровень, унаследованный от rootи оставь того же самого аппендера

log4j.logger.my_package=info
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...