Почему 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 отображает все события?
См. Этот ответ на аналогичный вопрос о цепочке регистраторов в 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
Обратите внимание на наследование, описанное во введении . Если вы укажете уровень на уровне пакета, он не унаследует уровень корневого регистратора. Вы используете отладку в указанных вами пакетах, а не информацию. Указание уровня отменяет все, что было унаследовано.
Если вы хотите унаследовать уровень корневого регистратора, избавьтесь от спецификации уровня в конфигурациях вашего регистратора.
Для получения rootlogger вы используете Logger.getRootLogger()
? Если нет, возможно, вы не получаете настоящий корневой логгер. Если это так, убедитесь, что порог stdout
не находится на уровне debug; порог аппендеров переопределяет порог уровней логгера.