简体   繁体   English

使用Logback的不同日志文件

[英]Different log files using Logback

I would like to log different log levels to different files , In addition to this I would like to have the default consoleAppender as well for each log level. 我想将不同的日志级别记录到不同的文件中,除此之外,我还希望每个日志级别都具有默认的consoleAppender。

So the output should be different log level files : 因此输出应为不同的日志级别文件:

  1. Info level file 信息级别文件
  2. Warn level file 警告等级文件
  3. Error level file 错误级别文件
  4. Console should also remain enabled all the time. 控制台也应始终保持启用状态。

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

The problem here is it writes each type of level in all files. 这里的问题是它将所有类型的级别写入所有文件。

Update the filter definitions to include: <onMismatch>DENY</onMismatch> , for example: 更新过滤器定义以包括: <onMismatch>DENY</onMismatch> ,例如:

<filter class="ch.qos.logback.classic.filter.LevelFilter">
  <level>INFO</level>
  <onMatch>ACCEPT</onMatch>
  <onMismatch>DENY</onMismatch> 
</filter> 

The default behaviour for onMismatch is FilterReply.NEUTRAL so by not including a onMismatch declaration you are effectively allowing all entries through the filter whether they match the given level or not. onMismatch的默认行为是FilterReply.NEUTRAL因此通过不包含onMismatch声明,可以有效地允许所有条目通过过滤器,无论它们是否与给定级别匹配。

You should also remove the multiple <root> declarations and replace them with this one: 您还应该删除多个<root>声明,并将其替换为此:

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

This declaration will cause all four of those appenders to be running and then the filter within each of the FILE , FILEWARN and FILEERROR appenders will ensure that they only handle log events of the correct level. 此声明将导致所有这四个附加程序都在运行,然后每个FILEFILEWARNFILEERROR附加程序中的过滤器将确保它们仅处理正确级别的日志事件。

This is what I have done , and it is working. 这是我所做的,并且正在工作。

 <configuration> <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> <onMismatch>DENY</onMismatch> </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> <onMismatch>DENY</onMismatch> </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> <onMismatch>DENY</onMismatch> </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="debug"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE" /> <appender-ref ref="FILEERROR" /> <appender-ref ref="FILEWARN" /> </root> <!-- <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> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM