逐步处理日志文件:提取数据并发送到另一个进程(zabbix)

时间:2012-07-27 15:16:14

标签: python bash logging zabbix

我希望能够从许多日志文件中提取数据。然后将提取的数据发送到zabbix。

举一个例子,假设(巨大的)日志文件包含

之类的信息
date: processed 566766 lines
date: processed 324523 lines
date: processed 546747 lines
date: processed 005643 lines

我希望能够将此数据发送到Zabbix。

使用awk我会做一些像

这样的事情
cat logfile | awk '/processed \d+ lines/ { system("zabbix command " $3) }'

我的问题是,因为文件很大,而且因为我不想要重复数据,所以我需要找到一种方法来开始读取日志文件,如果不在上一次运行中那么

所以它需要记住它在前一次读取的点,并开始只处理新添加的行。

我尝试了 fetchlog 但由于某种原因它无法正常工作且尚未维护。

您是否知道可以跟踪日益增长的日志文件或Pythonic方法的优秀实用程序?

我似乎记得syslog-ng或rsyslog有这方面的东西,但我认为它们只适用于syslog风格的日志,而我的不遵循任何标准。

此致

的Alessandro

2 个答案:

答案 0 :(得分:0)

Zabbix 2.0改进了日志文件监控,请参阅here

格式:

log[file,<regexp>,<encoding>,<maxlines>,<mode>]

对于正则表达式,您可以指定日志文件的每一行中的单词。

对于模式,跳过告诉Zabbix不要处理旧数据。

示例:

log[logfile,processed,,,skip]

您也可以编写脚本,只需将每个脚本运行的最后一行存储在一个文件中,并将其作为变量存储在脚本中。然后做这样的事情:

tail -n +$line_number logfile | awk '{print $3}'

您可以使用wc获取最后一个行号:

wc -1 logfile > /tmp/number_file

您需要+1,因此您不会解析最后一行两次。

可能值得将所有值存储在文件中,将主机名和项目键添加到每一行,并使用zabbix_sender

希望有所帮助。

答案 1 :(得分:0)