繁体   English   中英

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

[英]python WatchedFileHandler still writing to old file after rotation

我一直在使用WatchedFileHandler作为我的python日志文件处理程序,因此我可以使用logrotate (在ubuntu 14.04上)旋转我的日志,你知道这是文档所说的。 我的logrotate配置文件看起来像

/path_to_logs/*.log {
        daily
        rotate 365
        size 10M
        compress
        delaycompress
        missingok
        notifempty
        su root root
}

一切似乎都运转得很好。 我正在使用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

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

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

我正在使用RotatingFileHandler将我的旋转移动到python,但如果有人知道处理这个问题的正确方法,我很想知道。

使用logrotate的copytruncate选项。 来自docs

copytruncate

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

WatchedFileHandler在写入之前在日志文件中检测到设备和/或inode更改时执行翻转。 也许logstash没有观看的文件没有看到其设备/ inode的变化? 这可以解释为什么处理程序继续写入它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM