Slf4j日志优化,并解决几个问题

2022-03-08  本文已影响0人  程就人生

最近在维护线上项目的时候,发现了2个问题:
1. 过期的日志没有被删除。
2. 日志超过大小但没有重新生成,最终导致一个文件几个G,给维护人员带来很大的不便。配置呢,是按照这篇文章配置的:
Springboot整合Slf4j输出日志到控制台、文件、Mysql数据库

查看滚动策略 TimeBasedRollingPolicy 的源码,发现有几个参数没有配置:
1.启动项目后清理历史日志,默认值为 false,所以必须配置;

<cleanHistoryOnStart>true</cleanHistoryOnStart>

2.日志文件总大小,默认不绑定,也就是不限制,也需要配置一下;

<totalSizeCap>20GB</totalSizeCap>

把这2个参数加上去之后,解决了第一个问题,但是并没有解决第二个问题,继续调查。

无意中发现 SizeAndTimeBasedRollingPolicy 继承了 TimeBasedRollingPolicy ,SizeAndTimeBasedFNATP可以去掉了,调整部分:


<!-- SizeAndTimeBasedRollingPolicy,它根据时间和大小来制定滚动策略,既负责滚动也负责出发滚动 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">      
    <!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->  
    <!-- 文件名:log/sys.2017-12-05.0.log -->  
    <fileNamePattern>${LOG_HOME}/${LOG_NAME}.%d.%i.log</fileNamePattern>   
    <!-- 每产生一个日志文件,该日志文件的保存期限为30天 -->   
    <maxHistory>30</maxHistory>
    <!-- 日志总大小 -->
    <totalSizeCap>20GB</totalSizeCap>   
    <!--启动项目后清理历史日志-->
    <cleanHistoryOnStart>true</cleanHistoryOnStart> 
    <!-- maxFileSize:这是活动文件的大小,默认值是10MB,本篇设置为1KB,只是为了演示 -->    
    <maxFileSize>100MB</maxFileSize>
</rollingPolicy>

调整过后,依旧没有解决第二个问题,根据网友的提示,有可能是日志文件打印频率太高,最终导致日志文件无法分割。

这台服务器是收集数据的,客户机1000台,每台客户机下有100个数据点,每台客户机把100个数据点的数据以毫秒的速度发送给服务器......

控制台唰唰地,只能看见数据闪过的痕迹...

赶紧把那行打印日志最频繁的代码删了...

第二天再次观测,日志可以成功地按照大小和日期进行重新生成了。

最后总结
这次日志优化,主要优化5个点:
1. 日志文件由 Logback.xml 更改为 logback-spring.xml,无需在application.properties中引用。

修改原因见此

2. 配置参数的增加:

<!--启动项目后清理历史日志-->
<cleanHistoryOnStart>true</cleanHistoryOnStart>
<!--日志文件总大小-->
<totalSizeCap>20GB</totalSizeCap>

3. 使用SizeAndTimeBasedRollingPolicy类替换TimeBasedRollingPolicy,并移除SizeAndTimeBasedFNATP类。

4. 采用标准方式打印,不再使用字符串拼接打印;

// 优化前:
log.info("收集到的数据:" + data + "收集日期:" + new Date());
// 优化后:
log.info("收集到的数据:{},收集日期:{}",data,new Date());

5. 去掉打印频繁且无意义的打印。

参考官网文档:https://logback.qos.ch/manual/appenders.html#SizeAndTimeBasedRollingPolicy

上一篇下一篇

猜你喜欢

热点阅读