Рассмотрим следующую конфигурацию:
<configuration scan="true" scanPeriod="15 minutes">
<property name="LOG_FILE_PATH" value="..." />
<property name="DOCS_LOG_FILE_PATH" value="..." />
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE_PATH}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>${LOG_FILE_PATH}.%d</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{"HH:mm:ss,SSS"} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="DOCS_FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
<marker>DOC</marker>
</evaluator>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<file>${DOCS_LOG_FILE_PATH}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<minIndex>1</minIndex>
<maxIndex>5</maxIndex>
<fileNamePattern>${DOCS_LOG_FILE_PATH}.%i</fileNamePattern>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>10MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%d [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE" />
</root>
<!-- This level only be valid for this logger only -->
<logger name="com.company.webapp" level="DEBUG" loggerOnly="true">
<appender-ref ref="DOCS_FILE" />
</logger>
<logger name="org.springframework" level="WARN" />
</configuration>
Обратите внимание на loggerOnly="true"
, где я подразумеваю, что регистратор DOCS_FILE
должен получать все сообщения журнала от ERROR
до DEBUG
, в то время как root
регистрирует для этого регистратора только от INFO
. Это несколько инверсия ThresholdFilter
.
Текущие подходы на SO всегда обращаются к уровням вверх, я не хочу уровней ниже, но даже пользовательский InvertedThresholdFilter
даже не получает событие, потому что этот уровень журнала не включен для DOCS_FILE
.
Есть ли разумный подход к этому при сохранении читабельности конфигурации?