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

Почему 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 отображает все события?

Ответы [ 3 ]

5 голосов
/ 11 июня 2010

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

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

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

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

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
2 голосов
/ 11 июня 2010

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

1 голос
/ 11 июня 2010

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

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

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