Shell脚本监控日志文件,如果关键字触发,则执行命令?

49

有没有一种廉价的方式来监视类似于 tail -f log.txt 的日志文件,然后如果出现类似于 [error] 的内容,执行一个命令?

谢谢。

4个回答

70
tail -fn0 logfile | \
while read line ; do
        echo "$line" | grep "pattern"
        if [ $? = 0 ]
        then
                ... do something ...
        fi
done

2
哦,还有一件事,tail -fn0 logfile 似乎已经过期了,因为 HTTP 服务器日志文件很快就被重命名和压缩了。我认为脚本仍在监视旧的文件描述符?有没有办法在一段时间后自动更新文件 inode 或其他什么东西来更新 tail 命令? - est
11
只需在tail命令中添加"--retry"选项,或者使用"-F"代替"-f"选项,即可解决问题。 - Zizzencs
3
也考虑使用grep -q命令来设置返回码而不显示匹配的行。 - Adam Liss
1
问题在于,像catalina.out(apache)这样的日志具有历史记录,因此“finished in”等模式已经存在。有没有一种方法只检查未来的日志? - Siddharth

15

我还发现可以使用awk监视模式,并在找到模式时执行某些操作:

tail -fn0 logfile | awk '/pattern/ { print | "command" }'

当在日志中找到模式时,将执行该命令。该命令可以是任何Unix命令,包括Shell脚本或其他任何内容。


5

一种更加强大的方法是使用Monit。这个工具可以监控很多东西,其中之一就是它可以轻松地跟踪一个或多个日志文件,匹配正则表达式,然后触发一个脚本。如果您有一组要监视的日志文件或多个事件要触发,这将非常有用。


2
更好更简单:
tail -f log.txt | egrep -m 1 "error"
echo "Found error, do sth."
...

2
感谢您提供这段代码片段,它可能会立即提供一些帮助。通过展示为什么这是一个好的解决方案,适当的解释将极大地提高其教育价值,并使其对未来具有类似但不完全相同问题的读者更有用。请编辑您的答案以添加解释,并指出适用的限制和假设。 - Toby Speight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接