如何“批量”输出“尾巴-F”或每X秒输出一个数据stream中的所有数据?

我正在尝试实时监视日志文件。 说我发出一个命令,如:

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中的内容。

这很好地解决了rsyslog和ommail(和omfile模块,如果你的日志不是syslog兼容)。 我有一个安全的数据中心的不同厂商的多个设备都发送他们的系统日志事件到我的中央rsyslog服务器。 使用ommail模块,我可以在各种条件下设置电子邮件警报; 内置的间隔阈值确保我不会被消息充斥(我将它设置为每60分钟发送一个types的最大警报)。

工作良好,易于设置:只要确保你得到最新版本的rsyslog; Ubuntu 10.04.2LTS仍然使用了差不多两年前发布的4.2,并且缺less一些错误修复。

我想你可以用命名pipe道来做到这一点。

首先创buildpipe道和邮件进程:

mkfifo logwatch_fifo while true; do cat logwatch_fifo | mail ...; sleep 10; done 

然后进行监控并写入FIFO:

 tail -F mysystem.log | grep -i error > logwatch_fifo 

您可以根据自己的喜好进行调整,基本上可以通过使用while循环和睡眠的一些变化,在FIFO中缓冲输出的任何内容。

你需要在这里命名的pipe道,而不是一个普通的pipe道(例如pipe道输出到一个(while true ...)子shell,例如),因为如果你做后者的猫不放弃pipe道,如果尾巴不closures它结束。

你可以尝试一下“Tenshi”。 写在PERL :),能够监视多个日志文件,并由reg-exp触发。

Debian软件包 , Ubuntu软件包 , Gentoo ebuild