Log4j - значение приоритета и определение понятия имени параметра

Мой 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>

Я хотел бы понять поведение значения приоритета = "DEBUG" и param name = "Threshold" value = "DEBUG".

В моем регистраторе (com.sas) я установил значение приоритета "DEBUG", а appender этого регистратора - "B2BAPP", а в "B2BAPP" я определил "Порог" как "ОШИБКА".

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

Случаи:

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

приоритет = "ОШИБКА" и имя параметра = "Порог" = "DEBUG"

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

Ответ 1

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

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

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

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

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

Операторы протоколирования затем отправляются в Appender s. Адаптеры также могут быть настроены так, чтобы принимать только утверждения определенного уровня важности, выше определенного "порога".

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

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

сообщает приложению только принимать заявления о важности ERROR или выше (то есть ERROR и FATAL).

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

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

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

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

приоритет = "ОШИБКА" и имя параметра = "Порог" = "DEBUG"

1. Приоритет регистратора, установленный на DEBUG и порог приложения, установленный в ERROR, означает, что регистратор проходит по DEBUG, INFO, WARN, ERROR и FATAL, но appender принимает только ERROR и FATAL, поэтому вы получаете только ERROR и FATAL в свой журнал.

2. Приоритет регистратора, установленный на порог ERROR и порог приложения, установленный в DEBUG, означает, что регистратор проходит только по ERROR и FATAL, в то время как приложение принимает DEBUG, INFO, WARN, ERROR и FATAL. Вы снова получаете только 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

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