Ответ 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
Надеюсь, что это объяснение лучше описывает понятия.