diff --git a/spring/logback/logback.md b/spring/logback/logback.md index d57525e..73c7633 100644 --- a/spring/logback/logback.md +++ b/spring/logback/logback.md @@ -571,3 +571,152 @@ timestamp元素接收两个必填属性,`key`和`datePattern`,并接收一 - timeReference : 默认情况下,timestamp元素的值为当前配置文件被解析的事件,也可以将其设为`contextBirth`,即context创建时间 #### RollingFileAppender +`RollingFileAppender`继承了FileAppender,并且支持了滚动日志的能力。RollgingAppender拥有如下子组件: +- `RollingPolicy`:负责如何执行日志滚动操作 +- `TriggeringPolicy`:负责决定是否/何时出发日志滚动 + +RollingFileAppender同时需要RollingPolicy和TriggerPolicy组件,但是如果RollingPolicy实现了TriggerPolicy接口,那么只需要RollingPolicy即可。 + +如下是RollingFileAppender的属性: +- file: 值为String类型,如果日志只被写到RollingPolicy指定的目标设备,那么file属性可以为空 +- append:是否追加 +- encoder:同FileOutputStream +- rollingPolicy:值为`RollingPolicy`类型 +- triggeringPolicy:值为`TriggeringPolicy`类型 +- prudent + +##### RollingPolicy +`RollingPolicy`负责日志滚动过程,其中涉及文件移动和重命名。 + +RollingPolicy接口展示如下: +```java +package ch.qos.logback.core.rolling; + +import ch.qos.logback.core.FileAppender; +import ch.qos.logback.core.spi.LifeCycle; + +public interface RollingPolicy extends LifeCycle { + + public void rollover() throws RolloverFailure; + public String getActiveFileName(); + public CompressionMode getCompressionMode(); + public void setParent(FileAppender appender); +} +``` +其中,各方法代表含义如下: +- rollober: 将当前日志文件归档 +- getActiveFileName:计算当前日志文件的文件名(实时日志将会被写入到其中) +- getCompressionMode: 决定压缩模式 +- setParent:设置关联的FileAppender + +##### TimeBasedRollingPolicy +TimeBasedRollingPolicy是最常用的rollingPolicy,其基于时间来执行滚动操作,可以通过其设置按天或按月滚动。 + +TimeBasedRollingPolicy同时实现了RollingPolicy和TriggeringPolicy接口。 + +TimeBasedRollingPolicy接收一个必填的`fileNamePattern`参数,并且拥有可选填参数: +- `fileNamePattern`: 该属性定义了已经被滚动(已被归档)文件的文件名,该属性的应该含有文件名,并且在适当位置加上`%d转换说明符`(%d{yyyy-MM-dd})。 + > ##### %d转换说明符 + > %d转换说明符包含一个date-and-time格式的字符串,该格式和SimpleDateFormat相同。如果该date-and-time被省略,那么默认为yyyy-MM-dd. + > + > 可以在fileNamePattern中含有多个%d转换说明符,但是只能有一个`主%d转换说明符`,主%d转换说明符用于推断滚动周期。其他说有的%d转换说明符都需要通过`aux`来进行修饰(`%d{yyyy/MM, aux}`)。 + > + > 示例如下 + > + > `/var/log/%d{yyyy/MM, aux}/myapplication.%d{yyyy-MM-dd}.log`. + + 滚动周期的值将会从date-and-time表达式来推断。 + + RollingFileAppender中,file属性可以被省略或设置为null。如果为RollingFileAppender设置了file属性,那么可以解耦当前日志和已经被归档的日志。如果file属性的值,那么当前日志路径就是file文件的值,此时当前日志的路径不会随着日期的变动而改变。 + + 但是,在省略file属性的情形下,那么当前日志文件路径将会根据fileNamePattern来计算 + +- `maxHistory`: `maxHistory`指定了保留归档日志的最大数量,会对旧日志进行异步删除。 + + 如果将maxHistory设置为0,将会禁用旧日志删除。默认情况下,maxHistory被设置为0。 + +- `totalSizeCap`:`totalSizeCap`控制了所有归档日志文件的最大大小,当最大小超过阈值时,最老的文件将会被删除。`totalSizeCap`需要`maxHistory`属性也被设置,通常,totalSizeCap都在maxHistory之后被应用。 + +默认情况下,totalSizeCap被设置为0,代表不会有总大小的阈值限制。 + +- `cleanHistoryOnStart`:如果该属性被设置为true,当appender启动时归档日志将会被清除。 + +TimeBasedRollingPolicy支持文件自动压缩,如果`fileNamePattern`后缀以`.gz`或`.zip`结尾,文件压缩将会自动被应用。 + +示例如下 +``` +/wombat/foo.%d.gz +``` +上述示例当前日志被输出到`/wombat/foo.yyyy-MM-dd`文件中,但是在第二天触发归档后,文件将会被压缩到`/wombat/foo.yyyy-MM-dd.gz`中。 + + +TimeBasedRollingPolicy示例如下: +```xml + + + logFile.log + + + logFile.%d{yyyy-MM-dd}.log + + + 30 + 3GB + + + + + %-4relative [%thread] %-5level %logger{35} -%kvp- %msg%n + + + + + + + +``` + +#### SizeAndTimeBasedRollingPolicy +SizeAndTimeBasedRollingPolicy支持配置单个日志文件的最大大小,其除了支持%d转换符外,还支持%i转换符,%i转换符也是必填的。每当当前日志文件达到最大文件大小时,其都会递增`%i`序列号,并且旧日志文件将会被归档。序列号从0开始。 + +SizeAndTimeBasedRollingPolicy还包含如下属性: +- `maxFileSize`:每当当前日志文件达到`maxFileSize`指定的大小时,其都会递增序列号,序列号默认为0. + + maxFileSize为FileSize类型,可以通过`KB, MB, GB`等单位来指定。 + +- `checkIncrement`:检查当前日志文大小的间隔时间,默认为60s + +```xml + + + mylog.txt + + + mylog-%d{yyyy-MM-dd}.%i.txt + + 100MB + 60 + 20GB + + + %msg%n + + + + + + + + + +``` + +#### Encoder +通常,PatternLayoutEncoder,其pattern可以指定为如下形式: +```xml + + + %d{dd-MM-yyyy HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M - %msg%n + + +```