Python、Tailer 和 Logrotate

2 投票
2 回答
2441 浏览
提问于 2025-04-17 09:11

我在Python中使用tailer来解析日志,但如果服务器上进行了日志轮换,它就会出问题。那么有什么其他的选择可以用呢?用popen中的tail -f,这样做不太符合Python的风格。

2 个回答

0

在日志轮换(logrotate)事件发生后,会出现以下情况:

  1. 日志文件的inode(索引节点)没有改变,但日志被重命名为新名字(例如 log.out.1)
  2. logrotate会创建一个同名的新文件(log.out)(我不太确定 :-)

tailer模块仍然会查看旧文件的inode。

你需要监控日志文件的inode值,以便正确跟踪日志。这就是'tail -F'的作用。

从它的源代码可以看出,tailer模块并没有设计成可以跟踪源文件的日志轮换:它是基于某种配方的。

http://code.activestate.com/recipes/157035/

所以对于你的任务来说,它并不太有用。

请查看源配方的评论。

--

附言:或者使用我写的那个,它是'tail -f'的一个封装 :)

http://code.activestate.com/recipes/577398-tail-f-with-inode-monitor/

0

添加日志轮换功能其实并不难。比如说,如果你有:

for line in tailer.follow(open('test.txt')):
    print line

你可以在一个函数里加一个回调,这个回调会定期检查下一个文件名是否存在。如果存在,就跳出循环,开始在新文件上记录日志。

撰写回答