介绍RollingFileAppender的使用

342 阅读3分钟

RollingFileAppender

该组件的属性包括file、append、encoder、rollingPolicy和triggeringPolicy,其中rollingPolicy和triggeringPolicy必须同时存在,当然,如果有一个类同时继承了这两个接口,也是可以的。
file、append和encoder不再介绍,参照《第三节》解读Logback的配置文件,主要对rollingPolicy和triggeringPolicy介绍。

  • rollingPolicy接口:提供了文件移动或重命名等操作策略,负责干什么,有以下几个实现:
  • triggeringPolicy接口:负责什么时候执行操作,负责时机

实现组件

上述接口不能用来引用,所以官方提供了几个常用的实现组件,挨个介绍一下。

TimeBasedRollingPolicy

  • 该实现很常用,主要使用场景:根据时间的推进不断创建日志文件。
  • 实际上:TimeBasedRollingPolicy同时实现了rollingPolicy和triggeringPolicy接口,可以直接使用。
  • TimeBasedRollingPolicy中日志滚动策略不是根据时钟触发的,而是在记录日志同时判断的,所以如果没有日志被记录,即使过了0点,可能也不会生成当天新的日志文件,什么时候有日志被记录什么时候生成。
属性类型描述
fileString如果配置了,满足策略时,将新建一个文件,原来的文件被重命名为fileNamePattern定义的规则文件,如1日写入log.log,2日把log.log重命名为1.log,并新建log.log继续写日志,即日志将永远写入指定的文件;否则日志不断写入到规则定义的新文件,如1日写入1.log,2日写入2.log,1.log成为历史文件。【建议省略该配置,防止文件占用时无法重命名】
fileNamePatternString(必须)使用%d{yyyy-MM}格式指定文件名命名规则;如果存在多个%d{},只能有一个生效,其他需要标记为%d{yyyy-MM,aux};%d{}如果省略{},%d等价于%d{yyyy-MM-dd}
maxHistoryint(可选)最多保留多少日志文件
totalSizeCapint(可选)日志总容量(不是单个日志容量)上限,超限后删除最旧的日志;需要同时设置maxHistory,且优先级比maxHistory低
cleanHistoryOnStartbooleantrue:表示项目启动时执行删除策略;false:表示在日志滚动中执行删除策略(默认)

fileNamePattern中可以定义带有目录的命名规则,如/foo/%d{yyyy-MM,aux}/%d.log,/和\都可以作为路径分隔符。
如果希望日志备份时被压缩,可以给fileNamePattern添加.gz或.zip后缀,如/wombat/foo.%d.gz

来一个例子(是不是很眼熟、常见)

<configuration>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  	<!--使用文件排它锁保证多个jvm同时写入,该模式不建议使用,默认=false就挺好-->
  	<prudent>true</prudent>
  	<!--因为配置了该属性,每天都会新建新的logFile.log文件,昨天的被重命名-->
    <file>logFile.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- 每天日志文件logFile.log都会被重命名为logFile.2000-01-01.log的格式,新的日志继续写入logFile.log -->
      <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>

      <!--保留30个日志,且日志总量限制为30GB -->
      <maxHistory>30</maxHistory>
      <totalSizeCap>3GB</totalSizeCap>
    </rollingPolicy>

    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender> 

  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
</configuration>

SizeAndTimeBasedRollingPolicy

TimeBasedRollingPolicy支持采用日期和限制总量的方式,控制日志规则,而SizeAndTimeBasedRollingPolicy支持限制每一个日志的大小,不是总量。
使用 来控制,比如100MB 表示每个日志文件最大限制100MB。

再来一个例子

<configuration>
  <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>mylog.txt</file>
    <!--这里改成了 SizeAndTimeBasedRollingPolicy -->
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <!--【注意】这里多了一个写法 %i,表示每个日志文件达到上限后,在文件名中添加索引,类似mylog-2020-01-01.1.txt-->
      <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
       <!-- 每个文件最多100MB,保留60天的历史记录,但最多20GB -->
       <!--这里多了一个配置maxFileSize-->
       <maxFileSize>100MB</maxFileSize>    
       <maxHistory>60</maxHistory>
       <totalSizeCap>20GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="ROLLING" />
  </root>

</configuration>

FixedWindowRollingPolicy

不常用,有兴趣可以研究官网介绍(如果闲着没事的哈)