使用Logback的不同日志文件

Che*_*tan 0 java logback

我想将不同的日志级别记录到不同的文件中,除此之外,我还希望每个日志级别都具有默认的consoleAppender。

因此输出应为不同的日志级别文件:

  1. 信息级别文件
  2. 警告等级文件
  3. 错误级别文件
  4. 控制台也应始终保持启用状态。

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <charset>UTF-8</charset>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{35}) - %msg %n</pattern>
    </encoder>
  </appender>

    <!-- Logging settings for the info logs -->
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>INFO</level>
      <onMatch>ACCEPT</onMatch>
    </filter> 
    <file>logs\logFile.html</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- daily rollover -->
      <fileNamePattern>logs\logFile.%d{yyyy-MM-dd}.%i.html</fileNamePattern>
      <timeBasedFileNamingAndTriggeringPolicy
          class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
          <!-- or whenever the file size reaches 50MB -->
        <maxFileSize>5MB</maxFileSize>
      </timeBasedFileNamingAndTriggeringPolicy>
      <!-- keep 60 days' worth of history -->
      <maxHistory>60</maxHistory>
    </rollingPolicy>
    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
      <charset>UTF-8</charset>
      <layout class="ch.qos.logback.classic.html.HTMLLayout">
        <pattern>%d{HH:mm:ss.SSS}%thread%level%logger%line%msg</pattern>
      </layout>         
    </encoder>
  </appender>

  <!-- Logging settings for the error logs -->
  <appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>ERROR</level>
      <onMatch>ACCEPT</onMatch>
    </filter> 
    <file>logs\logFileError.html</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- daily rollover -->
      <fileNamePattern>logs\logFileError.%d{yyyy-MM-dd}.%i.html</fileNamePattern>
      <timeBasedFileNamingAndTriggeringPolicy
          class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
          <!-- or whenever the file size reaches 50MB -->
        <maxFileSize>5MB</maxFileSize>
      </timeBasedFileNamingAndTriggeringPolicy>
      <!-- keep 60 days' worth of history -->
      <maxHistory>60</maxHistory>
    </rollingPolicy>
    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
      <charset>UTF-8</charset>
      <layout class="ch.qos.logback.classic.html.HTMLLayout">
        <pattern>%d{HH:mm:ss.SSS}%thread%level%logger%line%msg</pattern>
      </layout>         
    </encoder>
  </appender>

  <!-- Logging settings for the warn logs -->
  <appender name="FILEWARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>WARN</level>
      <onMatch>ACCEPT</onMatch>
    </filter> 
    <file>logs\logFileWarn.html</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- daily rollover -->
      <fileNamePattern>logs\logFileWarn.%d{yyyy-MM-dd}.%i.html</fileNamePattern>
      <timeBasedFileNamingAndTriggeringPolicy
          class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
          <!-- or whenever the file size reaches 50MB -->
        <maxFileSize>5MB</maxFileSize>
      </timeBasedFileNamingAndTriggeringPolicy>
      <!-- keep 60 days' worth of history -->
      <maxHistory>60</maxHistory>
    </rollingPolicy>
    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
      <charset>UTF-8</charset>
      <layout class="ch.qos.logback.classic.html.HTMLLayout">
        <pattern>%d{HH:mm:ss.SSS}%thread%level%logger%line%msg</pattern>
      </layout>         
    </encoder>
  </appender>   

  <root level="info">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="FILE" />     
  </root>

  <root level="error">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="FILEERROR" />     
  </root>

  <root level="warn">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="FILEWARN" />     
  </root>

</configuration>
Run Code Online (Sandbox Code Playgroud)

这里的问题是它将所有类型的级别写入所有文件。

gly*_*ing 5

更新过滤器定义以包括:<onMismatch>DENY</onMismatch>,例如:

<filter class="ch.qos.logback.classic.filter.LevelFilter">
  <level>INFO</level>
  <onMatch>ACCEPT</onMatch>
  <onMismatch>DENY</onMismatch> 
</filter> 
Run Code Online (Sandbox Code Playgroud)

默认行为onMismatchFilterReply.NEUTRAL通过不包含onMismatch声明来有效地允许所有条目通过过滤器,无论它们是否与给定级别匹配。

您还应该删除多个<root>声明,并将其替换为此:

<root level="info">
  <appender-ref ref="STDOUT" />
  <appender-ref ref="FILE" />
  <appender-ref ref="FILEWARN" /> 
  <appender-ref ref="FILEERROR" />      
</root>
Run Code Online (Sandbox Code Playgroud)

该声明将导致这些附加目的地的所有四个内每个运行,然后过滤FILEFILEWARNFILEERROR追加程序将确保他们只处理正确的级别的日志事件。