RollingFileAppender
该组件的属性包括file、append、encoder、rollingPolicy和triggeringPolicy,其中rollingPolicy和triggeringPolicy必须同时存在,当然,如果有一个类同时继承了这两个接口,也是可以的。
file、append和encoder不再介绍,参照《第三节》解读Logback的配置文件,主要对rollingPolicy和triggeringPolicy介绍。
- rollingPolicy接口:提供了文件移动或重命名等操作策略,负责干什么,有以下几个实现:
- triggeringPolicy接口:负责什么时候执行操作,负责时机
实现组件
上述接口不能用来引用,所以官方提供了几个常用的实现组件,挨个介绍一下。
TimeBasedRollingPolicy
- 该实现很常用,主要使用场景:根据时间的推进不断创建日志文件。
- 实际上:TimeBasedRollingPolicy同时实现了rollingPolicy和triggeringPolicy接口,可以直接使用。
- TimeBasedRollingPolicy中日志滚动策略不是根据时钟触发的,而是在记录日志同时判断的,所以如果没有日志被记录,即使过了0点,可能也不会生成当天新的日志文件,什么时候有日志被记录什么时候生成。
| 属性 | 类型 | 描述 |
|---|---|---|
| file | String | 如果配置了,满足策略时,将新建一个文件,原来的文件被重命名为fileNamePattern定义的规则文件,如1日写入log.log,2日把log.log重命名为1.log,并新建log.log继续写日志,即日志将永远写入指定的文件;否则日志不断写入到规则定义的新文件,如1日写入1.log,2日写入2.log,1.log成为历史文件。【建议省略该配置,防止文件占用时无法重命名】 |
| fileNamePattern | String | (必须)使用%d{yyyy-MM}格式指定文件名命名规则;如果存在多个%d{},只能有一个生效,其他需要标记为%d{yyyy-MM,aux};%d{}如果省略{},%d等价于%d{yyyy-MM-dd} |
| maxHistory | int | (可选)最多保留多少日志文件 |
| totalSizeCap | int | (可选)日志总容量(不是单个日志容量)上限,超限后删除最旧的日志;需要同时设置maxHistory,且优先级比maxHistory低 |
| cleanHistoryOnStart | boolean | true:表示项目启动时执行删除策略;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
不常用,有兴趣可以研究官网介绍(如果闲着没事的哈)