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

背景


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

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

切割结果:

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

原因


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

 解决方案


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

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

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

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

2、给rsyslog发信号。重新打开log文件,配置文件如下:[踩坑篇]logrotate切割日志后,日志还是写在老日志文件中_第2张图片

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

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

你可能感兴趣的:(运维,运维,LINUX)