【问题标题】:Process logfiles progressively: Extract data and send to another process (zabbix)逐步处理日志文件:提取数据并发送到另一个进程(zabbix)
【发布时间】:2012-07-27 15:16:14
【问题描述】:

我希望能够从多个日志文件中提取数据。然后将提取的数据发送到 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,但由于某种原因它不起作用并且没有得到维护。

您知道可以跟踪不断增长的日志文件的好实用程序,还是 Python 式的方法?

我似乎记得 syslog-ng 或 rsyslog 对此有所帮助,但我认为它们仅适用于 syslog 样式的日志,而我的没有遵循任何标准。

问候

亚历山德罗

【问题讨论】:

  • 您是否考虑过 logrotate 每天轮换日志?您计划多久将数据发送到监控系统?
  • 每隔几分钟。不幸的是,轮换不是一种选择。
  • 所以感兴趣的数据“日期:已处理的 566766 行”分散在文件周围?无论如何,鉴于您的所有限制,我认为您必须计划在文件创建时只解析一次,然后将感兴趣的数据发送到可以根据您的日程安排将其发送到 zabbix 的进程。在此处和其他地方阅读有关 mkfifo 的信息,这可能会有所帮助。但是您仍然有一个问题,有一天,该日志文件对于操作系统来说会变得太大,并且必须清零并重新启动。然后你必须获得新的日志文件的新句柄。祝你好运!

标签: python bash logging zabbix


【解决方案1】:

Zabbix 2.0 改进了日志文件监控,见here

格式:

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

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

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

示例:

log[logfile,processed,,,skip]

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

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

你可以用 wc 获取最后的行号:

wc -1 logfile > /tmp/number_file

您需要为此 +1,这样您就不会两次解析最后一行。

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

希望对您有所帮助。

【讨论】:

  • 您好,Zabbix 中的日志工具不允许您从处理的行中提取数据。它只是提醒内容而不是数据提取。
  • 还是谢谢你的回答,我正在考虑写一个 Python 脚本,看看它是如何执行的。
【解决方案2】:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 2012-09-23
  • 2017-12-14
  • 1970-01-01
相关资源
最近更新 更多