Logback: настроить один конкретный регистратор для входа ниже уровня - PullRequest
0 голосов
/ 01 ноября 2018

Рассмотрим следующую конфигурацию:

<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.

Есть ли разумный подход к этому при сохранении читабельности конфигурации?

...