log4j2如何实现日志文件的生命周期管理
log4j2如何实现日志文件的生命周期管理
对于日志的认知,不同阶段是不一样的。在大学刚学Java的时候,根本不理解日志的用处,甚至觉得日志和控制台输出的内容不一样吗。后来学到log4j,通过配置输出IFO、ERROR不同等级的日志,才明白,原来日志和控制台输出是不一样。
后来参加工作,在项目中了解slf4j,作为门面设计可以在项目中不用修改代码,就可以替换不同的日志框架(例如log4j替换logback),具体可以参考文章:slf4j、log4j、log4j2、logback到底用哪些jar。
随着接触的项目越来越多,日志已经成为了排查程序故障最重要的一环。但是一个问题也浮现了出来,如何管理日志的生命周期? 。会多时候会出现日志文件把用户目录磁盘写满导致系统异常,以及日志目录下可以看到几年前日志文件的情况。
所以,对于日志的生命周期管理也是重中之重。对于上述情况,通常有两种手段。一是通过shell脚本定期清理日志,但是这种做法的弊端就是需要在每台主机部署脚本。二是在日志的配置文件中,设置清理的参数。今天主要讲讲方法二,如何通过配置实现日志生命周期的管理。
log4j和log4j2是Java初期最先接触的,也是之前项目中最常用的日志框架。这里就用log4j2来实践一下日志文件生命周期的管理。
依赖
首先,我们引入log4j2、slf4j和lombok的依赖。
代码语言:xml复制<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</version>
</dependency>
<!-- Log4j2 SLF4J Binding -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.20.0</version>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
<scope>provided</scope>
</dependency>
log4j2.xml
然后配置log4j2.xml文件,整体配置如图所示:
我们拿出其中的Appender部分,来看看是如何实现日志清理策略的。
代码语言:xml复制<RollingFile name="InfoFile" fileame="${log.path}/info.log" filePattern="${log.path}/info-%d{yyyy-MM-dd-HH-mm}.log.gz">
<PatternLayout>
<Pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{6} - %msg%n</Pattern>
</PatternLayout>
<Policies>
<!-- 基于时间的触发策略 -->
<TimeBasedTriggeringPolicy />
</Policies>
<DefaultRolloverStrategy>
<!-- 设置清理策略 -->
<Delete basePath="${log.path}" maxDepth="1">
<IfFileame glob="info-*.log.gz" />
<!-- 删除 2 分钟前的日志文件 -->
<IfLastModified age="2m" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
只说其中的一部分配置:filePattern:指定滚动日志的存储路径和命名规则,日志文件会按时间滚动,每分钟生成一个文件,压缩为 .gz 格式。
主要通过 DefaultRolloverStrategy 配置日志文件的清理规则。basePath指定日志文件的存储目录。maxDepth限制清理目录的深度,防止误删其他文件。
IfFileame匹配要清理的文件,glob 使用通配符匹配。这里IfLastModified的age属性表示删除最后修改时间早于2分钟的文件。这里m表示分钟,h表示小时,d表示天。
测试程序
使用while True实现持续输出日志的程序,代码如下:
代码语言:java复制import slf4j.Slf4j;
@Slf4j
public class Log4jTest {
public static void main(String[] args) throws InterruptedException {
while (true) {
Thread.sleep(10 * 100);
log.info("aqi");
}
}
}
启动程序,日志持续写入info.log中,log4j2每分钟都会生成滚动的日志文件,然后会触发日志清理策略,如图所示:
日志滚动
顺便一提,在上面的Policies设置成按时间滚动,但为了避免单个日志文件在单位时间内过大或过小,还可以通过SizeBasedTriggeringPolicy标签,设置日志文件的大小。
代码语言:xml复制<SizeBasedTriggeringPolicy size="10MB"/>
对于常用的logback也可以通过同样的方式,设置日志滚动和清理策略,对于使用了slf4j框架的应用来说,只需要将所有log4j2的依赖替换成logback的依赖即可,无需修改代码。
在实际生产中,通常会是以天滚动日志。但是通常我不会设置清理策略,前提是磁盘足够,,因为如果遇到一些问题的时候,可能需要对过去的日志进行分析。所以尽量保留两个月内的日志,合理的设置清理策略。
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
推荐阅读
留言与评论(共有 14 条评论) |
本站网友 flags | 30分钟前 发表 |
log4j2log4j和log4j2是Java初期最先接触的 | |
本站网友 王朝大酒店 | 17分钟前 发表 |
对于上述情况 | |
本站网友 pacemaker | 2分钟前 发表 |
可能需要对过去的日志进行分析 | |
本站网友 交错时光的爱恋 | 0秒前 发表 |
这里IfLastModified的age属性表示删除最后修改时间早于2分钟的文件 | |
本站网友 中国邮政快递单号查询跟踪记录 | 18分钟前 发表 |
以及日志目录下可以看到几年前日志文件的情况 | |
本站网友 南昌第五医院 | 3分钟前 发表 |
log4j2 | |
本站网友 开心游戏网 | 2分钟前 发表 |
结语在实际生产中 | |
本站网友 谷芽的功效 | 2分钟前 发表 |
但是一个问题也浮现了出来 | |
本站网友 廖英强新浪博客 | 6分钟前 发表 |
每分钟生成一个文件 | |
本站网友 bt种子网站 | 30分钟前 发表 |
以及日志目录下可以看到几年前日志文件的情况 | |
本站网友 伴娘 | 10分钟前 发表 |
无需修改代码 | |
本站网友 爱秦湾 | 25分钟前 发表 |
mm | |
本站网友 乳房下垂 | 11分钟前 发表 |
如图所示:日志滚动顺便一提 |