2012-07-27 42 views
1

我希望能够从多个日志文件中提取数据。提取的数据将被发送到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样式的日志,而我的并不遵循任何标准。

问候

亚历山德罗

+1

你有没有考虑logrotate的日常旋转日志?你打算多久将数据发送到监控系统? – jordanm 2012-07-27 15:23:57

+0

每隔几分钟。不幸的是,旋转不是一种选择。 – Alessandro 2012-07-27 16:46:59

+0

所以感兴趣的数据'日期:处理566766行'散落在文件周围?在任何情况下,考虑到所有限制,我认为您必须计划在创建文件时解析文件一次,然后将感兴趣的数据发送到可以按照您的日程安排发送给zabbix的进程。阅读这里和其他有关mkfifo的地方,可能会有所帮助。但是,你仍然有问题,有一天,该日志文件将变得太大,操作系统,必须被清零并重新启动。然后你必须得到新的日志文件的句柄。祝你好运! – shellter 2012-07-27 18:50:55

回答

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 -1 logfile > /tmp/number_file 

你需要+1那这样你就不会解析最后一行的两倍。

可能值得将所有值存储在文件中,请将主机名和项密钥存入每行,并使用zabbix_sender

希望有所帮助。

+0

嗨,Zabbix中的日志工具不允许你从你处理的行提取数据。它只是提醒内容而不是提取数据。 – Alessandro 2012-07-31 10:26:12

+0

感谢您的答复,无论如何,我正在考虑编写一个Python脚本并查看它的表现。 – Alessandro 2012-07-31 10:27:26

相关问题