python WatchedFileHandler在轮换后仍然写入旧文件

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,偶尔会把所有日志都收尾),但我觉得我一定做错了.

我正在使用WatchedFileHandlerlogrotate不是RotatingFileHandler出于多种原因,但主要是因为它会在轮换后很好地压缩我的日志.

更新:

我尝试了在我的日志轮换配置脚本末尾添加手动尾部的可怕黑客攻击.

sharedscripts
postrotate
    /usr/bin/tail -n 1 path_to_logs/*.log.1
endscript
Run Code Online (Sandbox Code Playgroud)

当然这大部分时间都可以工作,但有时因为没有明确原因而随机失败,所以不是解决方案.我也尝试了一些不太讨厌的解决方案,我已经修改了WatchFileHandler检查文件是否已更改的方式,但没有运气.

我很确定我的问题的根源是日志存储在网络驱动器上,这在某种程度上混淆了文件系统.

我正在将我的轮换移动到python RotatingFileHandler,但如果有人知道处理这个问题的正确方法,我很乐意知道.

Muh*_*hir 0

使用copytruncatelogrotate 选项。来自文档

复制截断

创建副本后就地截断原始日志文件,而不是移动旧日志文件并选择性地创建新日志文件,当某些程序无法被告知关闭其日志文件并因此可能继续写入(追加)到时,可以使用它永远保留以前的日志文件。请注意,复制文件和截断文件之间的时间片非常短,因此可能会丢失一些日志记录数据。使用此选项时,创建选项将不起作用,因为旧日志文件保留在原处。