[踩坑篇]logrotate切割日志后,日志还是写在老日志文件中

背景


   公司的生产环境中,使用gunicorn部署后端后端django服务,每天会产生很多前端掉调用后端api的日志文件,为了方便管理这些文件,使用了Linux自带的日志切割工具logrotate,每天对log目录下的日志文件进行切割备份,使用起来十分方便。

    但是在使用两天后发现了一个问题:虽然日志文件每天凌晨三点会进行切割,并将老的日志文件以时间戳为结尾进行备份,但是程序依然会将日志信息写入老文件中,新的日志文件一直为空。配置及测试结果如下:

切割结果:

由上图可见,日志切割认为已经完成了,但是日志文件依旧会写进老文件中。

原因


    在网上查阅资料后发现了问题原因所在:虽然日志文件已经切割,老文件已经备份,但是rsyslog并不知道新文件的存在,在存储日志时依旧会打开旧日志文件。这是因为logrotate在切割备份时只是修改了文件名称,inode号并没有修改,rsyslog依旧会根据旧inode号打开日志文件。

 解决方案


针对此问题,有两种解决方案供大家选择:

1、在配置/etc/logrotate.d/目录下的配置文件中添加参数copytrancate

原理:可以理解为把内容拷贝走作为备份,然后清空当前文件。

不足:拷贝和截断之间有时间差,如果在切割时期日志写入量比较大的话会造成大量日志丢失,个人觉得不适用于生产环境。

2、给rsyslog发信号。重新打开log文件,配置文件如下:

在每次进行日志切割后,给rsyslog进程发送信号,读取新的日志文件。

配置后使用logrotate -f /etc/logrotate.d/xxx进行测试,日志切割正常,信息也正常写入日志文件中!!!!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值