Log4j - объяснение понятия значения приоритета и имени параметра - PullRequest
20 голосов
/ 28 декабря 2011

Мой log4j.xml:

 <appender name="B2BAPP" class="org.apache.log4j.RollingFileAppender">
     <param name="File" value="/LOGS/SAM/B2B_VJ.log"/>   
     <param name="Threshold" value="ERROR"/> 
     <param name="MaxFileSize" value="10000KB"/>
     <param name="MaxBackupIndex" value="10"/>
     <param name="Append" value="false"/>
     <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d{dd MMM yyyy HH:mm:ss,SSS} %5p [%c:%L] %m%n"/>
     </layout>      
</appender>

<logger name="com.sas">    
   <priority value="DEBUG"/>
   <appender-ref ref="B2BAPP"/>
</logger>

Я хотел бы понять поведение значение приоритета = "ОТЛАДКА" и имя параметра = "Порог" значение = "ОТЛАДКА" .

В моем логгере (com.sas) я установил значение приоритета "DEBUG", а в качестве логгера этого регистратора используется "B2BAPP", а в "B2BAPP" я определил "Threshold" как "ERROR".

Таким образом, уровень журнала для "com.sas" будет установлен на "DEBUG" или "ERROR"?

Случаи:

значение приоритета = "DEBUG" и имя параметра = "пороговое" значение = "ОШИБКА"

значение приоритета = "ОШИБКА" и имя параметра = "пороговое значение" = "ОТЛАДКА"

Каким будет выход из вышеперечисленных случаев? Как это работает?

1 Ответ

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

Компонент Logger принимает инструкции ведения журнала (logger.debug(), logger.error() и т. Д.) И отправляет их в соответствующие пункты назначения на Appender s.

Вы можете установить «приоритет» на Logger и дать ему указание принимать только инструкции регистрации определенного уровня. Уровни (в порядке возрастания важности): TRACE, DEBUG, INFO, WARN, ERROR и FATAL.

Конфигурация, подобная этой:

<logger name="com.sas">
    <priority value="WARN" />
    ....
</logger>

предписывает регистратору com.sas принимать только уровни с уровнем важности WARN или выше (то есть WARN, ERROR и FATAL).

Заявления о регистрации затем отправляются на Appender с. Добавляющие также могут быть настроены на прием только утверждений определенного уровня важности, один из которых превышает определенный «порог».

Конфигурация как:

<appender name="B2BAPP" class="org.apache.log4j.RollingFileAppender">
   <param name="Threshold" value="ERROR"/> 
   ....
</appender>

говорит аппендиату принимать только сообщения о значении ОШИБКИ или выше (то есть ОШИБКА и ФАТАЛЬНО).

Таким образом, уровень журнала для "com.sas" будет установлен на "DEBUG" или "ERROR"?

В вашем примере уровень журнала установлен на DEBUG. То, что пишут участники, ортогонально проблеме.

Что касается ваших двух примеров:

значение приоритета = "DEBUG" и имя параметра = "пороговое" значение = "ОШИБКА"

значение приоритета = "ОШИБКА" и имя параметра = "пороговое" значение = "ОТЛАДКА"

1. Приоритет регистратора установлен на DEBUG, а пороговое значение appender установлено на ERROR означает, что регистратор передает DEBUG, INFO, WARN, ERROR и FATAL, но appender принимает только ERROR и FATAL, поэтому вы получаете только ERROR и ФАТАЛЬНО в ваш журнал.

2. Приоритет регистратора установлен на ERROR, а пороговое значение для appender установлено на DEBUG, что означает, что регистратор проходит только ERROR и FATAL, в то время как appender принимает DEBUG, INFO, WARN, ERROR и FATAL. Вы снова получаете только ОШИБКУ и ФАТАЛЬНО в свой журнал.

Но это просто неудачный случай. Смешивание приоритета и порога может дать вам приятную функциональность. Например ...

... предположим, что вы только что поместили приложение в промежуточную стадию, и вам нужно немного его контролировать, пока вы не переместите его в производство. У вас есть разработчик и системный администратор, выполняющий мониторинг. Пока разработчик хочет получить все журналы, системный администратор занят и хочет видеть только ошибки.

Как вы это настраиваете? Как насчет примерно такого:

<appender name="developerLogs" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="/LOGS/SAM/developerLogs.log" />
    <param name="Threshold" value="DEBUG" />
    <param name="Append" value="false" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%m%n"/>
    </layout>
</appender>

<appender name="sysAdminLogs" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="/LOGS/SAM/sysAdminLogs.log" />
    <param name="Threshold" value="ERROR" />
    <param name="Append" value="false" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%m%n"/>
    </layout>
</appender>

<logger name="com.test">
    <priority value="DEBUG" />
    <appender-ref ref="developerLogs" />
    <appender-ref ref="sysAdminLogs" />
</logger>

Если вы запускаете код вроде:

Logger logger = Logger.getLogger("com.test");

logger.debug("some debug statement");
logger.info("some info statement");
logger.warn("some warn statement");
logger.error("some error statement");
logger.fatal("some fatal statement");

вы получите это в sysAdminLogs.log:

some error statement
some fatal statement

и это в developerLogs.log:

some debug statement
some info statement
some warn statement
some error statement
some fatal statement

Надеюсь, это объяснение лучше описывает концепции.

...