监视 Linux 上的日志文件并将每一行发送到另一个程序

监视 Linux 上的日志文件并将每一行发送到另一个程序

apt-cacher-ng在 Ubuntu Linux 上运行一个服务器,它以以下格式写入日志:

1299745593|O|149406|XXX.XXX.XXX.XXX|uburep/pool/main/t/tiff/libtiff4_3.9.2-2ubuntu0.4_amd64.deb
1299745593|O|10154976|XXX.XXX.XXX.XXX|uburep/pool/main/l/linux-firmware/linux-firmware_1.34.4_all.deb     
1299748529|O|39368|XXX.XXX.XXX.XXX|uburep/pool/main/n/nagios-nrpe/nagios-nrpe-server_2.12-4ubuntu1_amd64.deb 
1300155440|O|680100|XXX.XXX.XXX.XXX|uburep/pool/main/t/tzdata/tzdata_2011c-0ubuntu0.10.04_all.deb

它显示时间戳、方向(进或出)、字节数、IP 和文件名。

每次写入一行时,我还想将该行发送给另一个程序。我会让这个程序将该行插入数据库,这样我就可以计算出一些统计数据,了解通过操作缓存服务器我们节省了多少带宽。

我不想cat每隔 X 分钟(通过)检查日志文件以cron查找新条目,因为这在计算上有点不经济。相反,我更愿意让守护进程监视日志,当检测到更改时,每行都会发送到我的数据库插入脚本。

能否swatch实现这一目标,或者有更好的选择?

答案1

根据您想要获得的守护进程的程度,您可能会遇到类似以下情况:

tail -f $FILE | xargs -n 1 frobwidget.sh

答案2

如果日志是通过 syslog 发送的,那么您可以添加 syslog 规则以将其发送到其他地方。具体操作取决于您使用的 syslog 类型(ksyslogd、syslog-ng、rsyslog 等)。

如果不是的话,swatch 看起来是解决这个问题的好办法。

可能我能想到的唯一另一种方式是,在不严重地破坏事情的情况下,编写脚本来在日志文件位置打开一个命名管道 - 并将日志写入数据库和磁盘上的备用位置 - 但这需要在 apt-cacher-ng 守护进程启动之前将命名管道放到位。

答案3

你看过使用 syslog-ng 记录到 mysql? 在 syslog-ng 中使用管道目标听起来与您要做的事情非常相似。

相关内容