Log4j2进阶使用(按大小时间备份日志)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Log4j2进阶使用(按大小时间备份日志)相关的知识,希望对你有一定的参考价值。

参考技术A 本文介绍Log4j2进阶使用,
基本使用请参考 Log4j2基本使用入门 。
本文基于上面的基本使用入门,
主要介绍按照日志大小和时间备份日志,
并且限制备份日志的个数,
以及删除过期的备份日志。

由于日志信息是不断追加到日志文件的,
经过一段时间会导致日志文件很大,
所以需要及时分割过大的日志文件,
以及限制日志文件占用的硬盘空间,
及时清理掉不用的过期的日志文件。

RollingFileAppender能实现上面提出的需求,
它需要配置TriggeringPolicy和RolloverStrategy,
TriggeringPolicy触发策略决定何时执行备份,
RolloverStrategy翻转策略决定如何执行备份。
如果没有配置RolloverStrategy翻转策略,
RollingFileAppender将使用DefaultRolloverStrategy,
而且DefaultRolloverStrategy支持自定义删除文件操作。

LOG_HOME用于指定当前日志存放的目录,
LOG_BACKUP用于指定备份日志存放的目录,
FILE_NAME用于指定日志文件的名称。
在需要的地方使用$LOG_HOME引用即可。

本章通过配置log4j2.xml,
实现如下目标:
最多保存3个日志备份文件,
每个日志文件大小不超过1MB。

这里增加了一个类型为RollingFile的Appender,
name为RollingSizeFile,
FileName为$LOG_HOME/$FILE_NAME.log,
指定了当前正在打印的日志文件名称,
和文件存放的相对路径;
filePattern为$LOG_HOME/$LOG_BACKUP/$FILE_NAME-%i.log,
指定了备份后的日志文件名称和存放路径,
其中%i表示备份文件名按照正整数开始递增。
SizeBasedTriggeringPolicy策略指定了文件大小:

当日志文件达到1MB时生成备份文件,
大小以字节为单位指定,
后缀为KB、MB或GB,例如1GB。

如果不填,默认值为10MB。

AppenderRef指定打印日志到新增的name为RollingSizeFile的Appender。

运行测试程序,
打印一段时间的日志,
在项目下会生成如下目录和文件:

可以看到logs目录下有test.log文件和backup目录,
backup目录下有test-1.log等7个备份文件,
而且每个文件的大小都是1MB。
上面由于没有配置RolloverStrategy滚动策略,
RollingFileAppender使用DefaultRolloverStrategy,
DefaultRolloverStrategy默认最多保存7个备份文件。

RollingFile中增加DefaultRolloverStrategy默认滚动策略,
并且指定最多保存3个备份文件:

修改后效果如下:

本章通过配置log4j2.xml,
实现如下目标:
每1分钟备份一次日志文件,
删除3分钟前备份的日志文件。

这里的配置和第4步中略有不同,
name为RollingTimeFile,
主要是filePattern、TimeBasedTriggeringPolicy配置不一样,
filePattern为$LOG_HOME/$$date:yyyy-MM/$FILE_NAME-%dyyyy-MM-dd-HH-mm.log,
其中$$date:yyyy-MM指定了备份文件存放的目录为当前年月,
比如目录2019-09,而不是backup了,
$FILE_NAME-%dyyyy-MM-dd-HH-mm.log指定了备份后的日志文件名称,
精确到分钟的一个时间戳

TimeBasedTriggeringPolicy策略指定了生成备份文件的策略。

这个配置要和filePattern结合使用,
上面filePattern中的命名规则是$FILE_NAME-%dyyyy-MM-ddHH-mm.log,
最小的时间粒度是mm,即分钟,
而TimeBasedTriggeringPolicy设置的interval是1,
结合起来就是每1分钟生成一个新文件。
同理,如果要每1小时生成一个新文件,
则改成%dyyyy-MM-ddHH,最小粒度为小时,
如果再把interval该为12,
那就是每12小时生成一个新文件。

AppenderRef指定打印日志到新增的name为RollingTimeFile的Appender。

运行测试程序,
打印一段时间的日志,
在项目下会生成如下目录和文件:

可以看到logs目录下有test.log文件和2019-09备份目录,
2019-09目录下有test-2019-09-27-17-20.log等14个备份文件,
而且每个文件的大小都不一样,与该时间段内打印的日志多少有关。
随着时间推移会生成2019-10之类的目录,
而且目录下的备份文件也会越来越多。

RollingFile中增加DefaultRolloverStrategy策略,
删除3分钟前备份的日志文件:

Delete表示删除满足条件的文件,
basePath指定了需要处理的日志目录,
因为备份的日志在basePath下的年月目录($$date:yyyy-MM),
所以maxDepth设置为2,代表扫描的目录深度,
maxDepth="1"表示当前目录。
指定文件名称:

匹配二级目录下的扩展名为.log的文件。

指定文件过期时间:

age的单位:D、H、M、S,分别表示天、小时、分钟、秒。
匹配最后修改时间为3分钟前的文件。

修改后效果如下:

查看目录时的当前时间是2019-09-29 15:44,
可以看到只保存了3分钟内生成的3个日志,
随着时间的推移,
生成新日志test-2019-09-29-15-44.log,
删除旧日志test-2019-09-29-15-41.log,
该目录下始终只有当前时间3分钟内的备份日志。

可以把按大小和时间备份结合起来使用,
实现更复杂的日志文件备份需求。
本章通过配置log4j2.xml,
实现如下目标:
每1分钟备份一次日志文件,
每个日志文件大小不超过1MB,
如果在1分钟内日志文件超过1MB,
则生成以当前时间+序号的备份日志,
但是每分钟内最多保存3个备份日志,
并且删除5分钟前备份的日志文件。

大部分配置和上面说过的一致,
就是简单的组合起来即可,
需要注意的是filePattern:

备份文件名$FILE_NAME-%dyyyy-MM-dd-HH-mm-%i.log结合了时间和序号。

运行测试程序,
打印一段时间的日志,
在项目下会生成如下目录和文件:

看到2019-09目录下只有5分钟内的备份日志,
每分钟的备份日志最多有3个文件,
根据日志具体打印的情况,
少的时候可能1分钟只有1或者2个文件,
多的时候最多也只有3个文件,
在这1分钟内后生成的日志会覆盖掉前面的。

下面给出完整的配置文件,
供大家开发时参考使用:

slf4j+log4j2基础教程(拿来即用教程)
log4j2 RollingRandomAccessFile配置
log4j2 入门教程

以上是关于Log4j2进阶使用(按大小时间备份日志)的主要内容,如果未能解决你的问题,请参考以下文章

Log4j2 进阶使用

如何在 Spring Boot 应用程序中使用 log4j2 根据大小生成新的日志文件

log4j2按日期按级别的日志文件归档(每天一个文件)

logback按天生成日志系统重启之后还会生成吗

log4j2 syslog 数据报大小超过 UDP 的限制

log4j2怎么输出日志到文件