Почему Log4j rootLogger не фильтрует события журнала согласно уровню события?

Почему Log4j rootLogger в моем приложении, не фильтрующем события журнала согласно уровню? В моем log4j.properties, У меня есть несколько регистраторов:

log4j.rootLogger=info,stdout
log4j.logger.com.name.myapp=debug,myapp
log4j.logger.org.castor=debug,castor
log4j.logger.org.exolab.castor=debug,castor
log4j.logger.org.hibernate=debug,hibernate
log4j.logger.org.springframework=debug,spring

Каждый из регистраторов получает и записывает многочисленные события журнала на уровнях DEBUG и выше, который является тем, что я ожидаю и требую. rootLogger, однако, несмотря на то, чтобы быть установленным выровняться INFO, отображает все эти события также включая DEBUG события, который не является тем, что я ожидаю и не, чего я требую. Вместо этого я ожидал бы, что это отфильтрует DEBUG события, но дисплей только события на уровне INFO и выше (WARN, ERROR, и FATAL), который является также, что я хочу. Почему rootLogger отображает все события?

6
задан Derek Mahar 11 June 2010 в 15:25
поделиться

3 ответа

См. Этот ответ на аналогичный вопрос о цепочке регистраторов в Log4j:

Принцип работы цепочки Log4j немного контр-интуитивно понятный (по крайней мере, для меня). Если уровень запроса равен или выше порог наиболее конкретных соответствующий регистратор, это принято. Один раз запрос принят, он получает обрабатывается полной цепочкой предки независимо от их пороги!

Это означает, что независимо от того, на каком уровне вы установили порог корневого регистратора, он всегда будет принимать и выводить событие журнала, которое принимает любой другой регистратор, если вы не отключите цепочку для этого дочернего регистратора или явно не установите порог его appender на более высокий уровень.

Итак, в этом случае есть два способа запретить корневому регистратору перехватывать события от других регистраторов. Первый - это более избирательный подход к отключению цепочки событий журнала:

log4j.additivity.com.name.myapp=false
log4j.additivity.org.castor=false
log4j.additivity.org.exolab.castor=false
log4j.additivity.org.hibernate=false
log4j.additivity.org.springframework=false

Второй способ более простой, но более ограничительный, поскольку он подавляет все события на консоли, которые ниже, чем INFO ( DEBUG и TRACE ):

log4j.appender.stdout.Threshold=info
6
ответ дан 10 December 2019 в 00:33
поделиться

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

Если вы хотите унаследовать уровень корневого регистратора, избавьтесь от спецификации уровня в конфигурациях вашего регистратора.

2
ответ дан 10 December 2019 в 00:33
поделиться

Для получения rootlogger вы используете Logger.getRootLogger()? Если нет, возможно, вы не получаете настоящий корневой логгер. Если это так, убедитесь, что порог stdout не находится на уровне debug; порог аппендеров переопределяет порог уровней логгера.

2
ответ дан 10 December 2019 в 00:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: