log4j2日志文件滚动
Appender在log4j2中有很多实现类,如ConsoleAppender(插件名称为Console)、FileAppender(插件名称为File)、RollingFileAppender(插件名称为RollingFile)等,在实际的项目中通常使用的都是RollingFileAppender,也就是日志文件滚动更新的Appender
1 | <RollingFile name="file" fileName="/data/log/app.log" |
其滚动依赖于TriggeringPolicy(触发策略)和RolloverStrategy(滚动更新策略)
TriggeringPolicy
TriggeringPolicy为触发策略,决定了何时触发日志文件的滚动。常见策略有CronTriggeringPolicy、OnStartupTriggeringPolicy、SizeBasedTriggeringPolicy、TimeBasedTriggeringPolicy、CompositeTriggeringPolicy
CronTriggeringPolicy
CronTriggeringPolicy是基于Cron表达式来进行触发的
1 | <!-- 根据cron来进行触发 --> |
代码
1 | public static CronTriggeringPolicy createPolicy(final Configuration configuration, |
该策略与SizeBasedTriggeringPolicy、TimeBasedTriggeringPolicy不同,不管日志是否写入,而是新开启一个定时线程来进行管理,而不是根据isTriggeringEvent方法来判断是否触发的
OnStartupTriggeringPolicy
OnStartupTriggeringPolicy是在JVM启动时触发
SizeBasedTriggeringPolicy
SizeBasedTriggeringPolicy是基于文件大小触发
1 | <!-- 当达到指定size时触发滚动操作,可以用KB/MB/GB作为单位,默认是10M --> |
代码
1 | public static SizeBasedTriggeringPolicy createPolicy(final String size) { |
在日志写入时会触发isTriggeringEvent方法来判断是否需要滚动
TimeBasedTriggeringPolicy
TimeBasedTriggeringPolicy是基于时间触发,与日志filePattern中的时间有关,当日志文件名中的pattern不再符合filePattern中的pattern时,就会触发滚动操作。如我配置的filePattern="/data/log/app.log.%d{yyyyMMdd}
,文件名为app.log.20240830.log,当时间到达20240831时,就会触发滚动操作
1 | <!-- |
代码
1 | public static TimeBasedTriggeringPolicy createPolicy( |
在日志写入时会触发isTriggeringEvent方法来判断是否需要滚动
CompositeTriggeringPolicy
CompositeTriggeringPolicy是组合多个策略进行触发
1 | <!-- 复合策略,将多个策略放到Policies中,满足一个条件就会触发滚动 --> |
RolloverStrategy
RolloverStrategy为滚动更新策略,决定了当触发日志文件的滚动时,如何进行文件的滚动。log4j2提供了默认的DefaultRolloverStrategy
DefaultRolloverStrategy
DefaultRolloverStrategy是提供的默认更新策略,即使不进行配置,也会使用该策略,默认max为7
1 | <!-- 默认max为7,表示最大保留的日志个数,超过则删除旧的日志 |