线上日志量较大问题分析

服务器磁盘告警源于应用日志过多,分析发现同时使用文件日志和控制台输出,且控制台输出未关闭。日志文件头存在二进制块,由logrotate的copytruncate配置引起文件空洞,导致日志体积不断增大。解决办法是将日志重定向方式改为追加模式。

服务器上磁盘告警,发现应用写的日志较多,由于需要保留近30天日志,希望能缩小体积。
分析发现了两个问题:
1、同时使用了文件日志和控制台输出;
2、控制台的日志做了切分,但是体积每天在变大;

控制台输出(重定向到nohup*文件)未关闭,因为部署脚本需要检查特定输出 “started successfully ” 来判定服务是否启动成功。这个可以修改日志配置,减少对控制台的输出。因为主要是使用FileAppender记录日志。
为了在平时开发时,使用控制台输出日志,可以利用logback对spring的扩展支持springProfile标签,修改logback-spring.xml如下:

<root level="info">
  <springProfile name="!prd">
    <appender-ref ref="console"/>
  </springProfile>
  <appender-ref ref="info_log"/>
  <appender-ref ref="error_log"/>
</root>
<springProfile name="prd">
  <!-- prd 时少输出控制台日志,给启动脚本检查用 -->
  <logger name="x.xx.xxx.MainApplication" level="INFO">
    <appender-ref ref="console"/>
  </logger>
</springProfile>

如果不是使用logback,也可以利用spring boot的profile配置多个log的配置文件;不细说了。

主要看看日志为什么越变越大。打开日志文件,发现头部分都是二进制块,显示类似如下:

^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@

查了下找到问题所在,是所谓了文件空洞。

由于使用logrotate日志切分工具,怀疑是切分日志时产生。查了一下资料,果然是logrotate使用了copytruncate配置,切分日志后,输出还从原来的偏移位置继续,这个位置之前会被\0填充。这是导致日志文件过大的正则原因。

在用fopen 打开或创建日志文件时,打开方式使用“w”类似于>,使用"a"类似于>>。非追加的方式在日志切割时,产生文件空洞。

这样,每次切分日志时,写入偏移未改变,所以文件体积未减小;导致日志越来越大,而每次切出去的日后也越来越大。
找的问题所在,解决起来就比较容易了只需要把重定向改为追加式的重定向就可以了。

nohup java -jar xxx.jar > nohup.out 2>&1 &

改为:

nohup java -jar xxx.jar >> nohup.out 2>&1 &

参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值