如何“批量”输出“tail -F”或者每X秒输出流中的所有数据?

如何“批量”输出“tail -F”或者每X秒输出流中的所有数据?

我正在尝试实时监控日志文件。假设我发出以下命令:

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 触发。

Debian 软件包Ubuntu 软件包Gentoo 的 ebuild

相关内容