我正在尝试实时监控日志文件。假设我发出以下命令:
tail -F mysystem.log|grep -i 错误|邮件...
这是为了监视我的日志文件,每次发现错误时,就通过电子邮件发送包含错误的行。
但是,可能会发生一些意外,导致我每秒收到数百个错误。我不想每秒发送数百封电子邮件导致我的邮件服务器崩溃。所以我想要某种延迟操作符:
tail -F mysystem.log|grep -i 错误|窗口 X|邮件...
这会将所有错误消息保留 X 秒,然后一起发布。这样,我最多每 X 秒就会收到一封电子邮件。
作为奖励,我很乐意做到以下几点:
tail -F mysystem.log|grep -i 错误|窗口 XY|邮件...
与上一个命令相同,但如果窗口中的行数大于 Y,则发送包含 Y 条消息的电子邮件(窗口清除并重置)。
如果不编写 PERL 程序,我该如何做到这一点?我想坚持使用 UNIX 中已经内置的功能。
答案1
使用 rsyslog 和 ommail(如果您的日志不兼容 syslog,则使用 omfile 模块)可以很好地解决这个问题。我在一个安全的数据中心内拥有来自不同供应商的多个设备,它们都将其 syslog 事件发送到我的中央 rsyslog 服务器。使用 ommail 模块,我根据各种条件设置电子邮件警报;内置间隔阈值可确保我不会被大量消息淹没(我将其设置为每 60 分钟最多发送一次每种类型的警报)。
运行良好,易于设置:只需确保您获取最新版本的 rsyslog;Ubuntu 10.04.2LTS 仍然附带近两年前发布的 4.2 版本,缺少一些错误修复。
答案2
我认为您可以使用命名管道来做到这一点。
首先创建管道和邮件流程:
mkfifo logwatch_fifo
while true; do cat logwatch_fifo | mail ...; sleep 10; done
然后进行监控,并写入fifo:
tail -F mysystem.log | grep -i error > logwatch_fifo
您可以根据自己的喜好进行调整,基本上可以使用 while 循环和 sleep 的一些变体对 fifo 中缓冲的输出进行任何您想做的事情。
这里您需要的是命名管道,而不是常规管道(例如,仅将输出通过管道传输到子(while true ...)
shell),因为如果您这样做,如果尾部没有关闭其末端,后者 cat 就永远不会放开管道。
答案3
你可以试试“Tenshi”。用 PERL 编写 :),能够监视多个日志文件并由 reg-exp 触发。