我希望监控日志文件,当新的日志消息与我定义的模式匹配时(比如包含“错误”),然后向我发送一封电子邮件。
为此,我编写了一个python脚本monitor.py,主要部分如下:
import sys
for line in sys.stdin:
if "error" in line:
print line
当我使用tail my.log | python monitor.py
时效果很好,然后切换到tail -f my.log | python monitor.py
,然后它不起作用,至少不会立即生效。
我做了一些测试,当日志的新内容累积到8KB时,我的python脚本可以从尾部输出。所以我高度怀疑这是由stdin / stdout缓冲区大小控制的。如何立即获得输出?
还有一个问题,当我使用tail -f my.log
和tail -f my.log | grep error
时,为什么它可以立即显示输出?
答案 0 :(得分:4)
如果stdout连接到TTY,则大多数Linux程序将使用行缓冲,否则将使用完全缓冲。您可以使用stdbuf
强制进行行缓冲。
stdbuf -oL tail -f my.log | python monitor.py
答案 1 :(得分:0)
有一个patch to add unbuffered output to tail,可以追溯到2008年。它似乎是rejected而我自己的(BSD)联机帮助页并没有表明它。也许你可以下载coreutils,应用补丁,自己编译尾巴,它可能仍然有用吗?