Tri*_*ews 7 python logging rotation
我一直在使用WatchedFileHandler作为我的python日志文件处理程序,因此我可以使用logrotate(在ubuntu 14.04上)旋转我的日志,你知道这是文档所说的.我的logrotate配置文件看起来像
/path_to_logs/*.log {
daily
rotate 365
size 10M
compress
delaycompress
missingok
notifempty
su root root
}
Run Code Online (Sandbox Code Playgroud)
一切似乎都运转得很好.我正在使用logstash将我的日志发送到我的弹性搜索集群,一切都很棒.我为我的调试日志添加了第二个日志文件,该文件被轮换但没有被logstash监视.我注意到,当该文件被旋转时,python只是继续写入/path_to_debug_logs/*.log.1并且永远不会开始写入新文件.如果我手动尾巴/path_to_debug_logs/*.log.1,它会立即切换并开始写入/path_to_debug_logs/*.log.
这对我来说真的很奇怪.
我相信正在发生的事情是logstash总是拖尾我的非调试日志,有些人会在logrotate调用之后触发切换到新文件.如果logrotate在没有切换的情况下调用两次,则会将log.1文件移动并压缩为log.2.gz,python无法再登录并且日志丢失.
很明显,有一堆hacky解决方案(比如cronjob,偶尔会把所有日志都收尾),但我觉得我一定做错了.
我正在使用WatchedFileHandler而logrotate不是RotatingFileHandler出于多种原因,但主要是因为它会在轮换后很好地压缩我的日志.
更新:
我尝试了在我的日志轮换配置脚本末尾添加手动尾部的可怕黑客攻击.
sharedscripts
postrotate
/usr/bin/tail -n 1 path_to_logs/*.log.1
endscript
Run Code Online (Sandbox Code Playgroud)
当然这大部分时间都可以工作,但有时因为没有明确原因而随机失败,所以不是解决方案.我也尝试了一些不太讨厌的解决方案,我已经修改了WatchFileHandler检查文件是否已更改的方式,但没有运气.
我很确定我的问题的根源是日志存储在网络驱动器上,这在某种程度上混淆了文件系统.
我正在将我的轮换移动到python RotatingFileHandler,但如果有人知道处理这个问题的正确方法,我很乐意知道.