Помогите понять аддитивность log4j-приложения по отношению к уровню приоритета - PullRequest
0 голосов
/ 06 апреля 2011

Я не понимаю, почему операторы INFO делают это на консоли.Вот общая настройка:

<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
    <param name="Target" value="System.out"/>
    <param name="Threshold" value="DEBUG"/>
    <layout .../>
</appender>

<appender name="REST_LOG" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="File" value="/logs/rest.log" />
    <param name="Threshold" value="INFO" />
    ....
</appender>

<category name="xyz.web">
    <priority value="WARN" />
    <appender-ref ref="CONSOLE" />
</category>

<category name="xyz.web.rest">
    <priority value="INFO" />
    <appender-ref ref="REST_LOG" />
</category>

Поэтому я хочу, чтобы операторы INFO и выше действовали только для операторов REST_LOG и WARN и выше для перехода к REST_LOG и CONSOLE.То, что я вижу, это заявления INFO от xyz.web.rest в REST_LOG, как и ожидалось, но также я вижу заявления INFO от xyz.web.rest в CONSOLE, чего я не ожидал.

Может кто-нибудь объяснить, что происходит?

Ответы [ 2 ]

4 голосов
/ 06 августа 2011

Вы должны установить аддитивность в false на xyz.web.rest регистраторе.

Без аддитивности вы увидите все сообщения INFO, зарегистрированные логгером xyz.web.rest дважды в консоли, потому что регистратор наследует приложение Root logger. и из xyz.web регистратора.

См. Раздел Appenders and Layouts документации Log4j

Именованная Иерархия
Считается, что регистратор является предком другого регистратора если его имя, за которым следует точка, является префиксом регистратора-потомка название. Считается, что регистратор является родителем дочернего регистратора, если есть между ним и потомком не было предков.

Например, регистратор с именем "com.foo" является родителем регистратора названный "com.foo.Bar". Точно так же "java" является родителем "java.util" и предок "java.util.Vector". Эта схема именования должна быть знаком большинству разработчиков.

Корневой регистратор находится на вершине иерархии регистратора. Это исключительно в двух направлениях:

  1. оно всегда существует,
  2. его нельзя получить по имени.

Приложения и макеты

Каждый включенный запрос регистрации для данного регистратора будет перенаправлен на все appenders в этом логгере, а также appenders выше в иерархия . Например, если консольный добавитель добавлен в root logger, тогда все включенные запросы на регистрацию будут как минимум печататься на консоль.

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

1 голос
/ 06 апреля 2011

Пороговые значения являются иерархическими.DEBUG включает в себя все INFO, WARN, ERROR.Поэтому вполне естественно, что если вы определяете консоль с порогом DEBUG, он будет получать сообщения уровня INFO.

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

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