Logback踩坑

2,440 阅读2分钟

Logback的学习最好到Logback官方文档上去,上边很细,很全。

配置

错误的配置

    <!-- 日志文件输出 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 文件名 -->
        <File>${LOG_HOME}/${APP_NAME}/user.log</File>
        <!-- 当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${LOG_HOME}/${APP_NAME}/user.log.%d{yyyy-mm-dd}.gz</FileNamePattern>
            <!-- 如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true -->
            <!-- 最大保存天数 -->
            <MaxHistory>10</MaxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread{30}] %logger{50} : %msg%n</pattern>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

这个配置在日志文件大于10MB的时候会触发归档,但是FileNamePattern 配置的时间没有到达所以并不会触发,并且日志文件已经停止输出了。

正确的配置

    <!-- 日志文件输出 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 日志激活输出文件名 -->
        <File>${LOG_HOME}/${APP_NAME}/auth.log</File>
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>

        <!-- 当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 归档文件名 aux:auxiliary 辅助的  即有多个地方使用了%d,需表明主要的 .gz 或 .zip自动开启压缩 -->
            <FileNamePattern>${LOG_HOME}/${APP_NAME}/%d{yyyy-MM-dd, aux}/auth.%d{yyyy-MM-dd}.%i.log.gz</FileNamePattern>
            <!-- 如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true -->
            <!-- 每个文件最大2MB,最大保存60天数据 总大小3GB  
                 单个文件超过2MB,触发滚动策略
                 时间触发
             -->
            <MaxHistory>60</MaxHistory>
            <maxFileSize>2MB</maxFileSize>
            <totalSizeCap>3GB</totalSizeCap>
        </rollingPolicy>
    </appender>

该配置使用了基于时间和大小的归档策略,当单个日志文件大于2MB的时候,会触发归档,在归档文件名后边添加索引。并且归档后的文件总大小最大3GB,最多保存60天。

有一个小坑,maxFileSize 的值少写一个B会检测到错误。如下:

<maxFileSize>2M</maxFileSize>

pic1.png

appender

RollingFileAppender 可以归档日志文件,有2个重要的子组件RollingPolicyTriggeringPolicyTriggeringPolicy负责触发的时间,RollingPolicy负责触发时做什么。

TimeBasedRollingPolicy

  1. TimeBasedRollingPolicy 实现了 RollingPolicyTriggeringPolicy,所以使用它的时候可以不用写TriggeringPolicy
  2. TimeBasedRollingPolicy的配置有一个必输的属性fileNamePattern,用来定义归档文件的名称,并且推断出归档的时间。
  3. TimeBasedRollingPolicy支持自动文件压缩,只要文件以.gz.zip结尾。

SizeAndTimeBasedRollingPolicy

SizeAndTimeBasedRollingPolicy 可以通过时间归档文件的同时限制文件的大小。 这个时候 %i 是必须要有的,他是用在在当前按时间归档前,大小已经超出限制的时候,每个归档文件的序号
如下图:

pic2.png

FixedWindowRollingPolicy

摘自官方文档

<configuration>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>test.log</file>

    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>tests.%i.log.zip</fileNamePattern>
      <minIndex>1</minIndex>
      <maxIndex>3</maxIndex>
    </rollingPolicy>

    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
      <maxFileSize>5MB</maxFileSize>
    </triggeringPolicy>
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender>
        
  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
</configuration>

该配置当单个日志文件超过5MB时触发FixedWindowRollingPolicy策略,该策略如其名像滑动窗口一样。维护一个1-3的日志文件,tests.1.log.ziptests.2.log.ziptests.3.log.zip。 如果test.log超过5MB,会将tests.3.log.zip 删掉,tests.2.log.zip 重命名为tests.3.log.ziptests.1.log.zip 重命名为 tests.2.log.ziptest.log 重命名为 tests.1.log.zip,然后新的日志继续写test.log,如此循环

SizeBasedTriggeringPolicy

他会检测激活的日志文件,一旦他超过设定的阈值,就会触发rollingPolicy来归档