我理解这个问题的方式是能够以与Zabbix'built-in log monitoring大致相同的方式监控具有日志记录的数据库。
如果是这样,这个问题分为两部分:(1)如何仅轮询数据库以获取新记录;(2)如何以 Zabbix 可以理解的方式向 Zabbix 发送数据。我将把(1)留给你,但会提出一种处理(2)的方法。
我们可以按照 Zabbix 代理处理 Windows 事件日志的方式来模拟 (2) 的解决方案。如果我们让 Windows 上的 Zabbix 代理监控,比如“eventlog[Application]”,我们会注意到它会向 Zabbix 服务器发送如下 JSON:
{
"data": [
{
"clock": 1398753145,
"ns": 928525552,
"eventid": 9003,
"host": "Windows 2008",
"key": "eventlog[Application]",
"lastlogsize": 51,
"severity": 1,
"source": "Desktop Window Manager",
"timestamp": 1375273705,
"value": "The Desktop Window Manager was unable to ..."
}
],
"request": "agent data"
}
现在,我们可以使用相同的协议发送我们想要的数据。例如,根据您的日志表的简化形式,我们可以将“log_id”放入“lastlogsize”,将“datetime”放入“timestamp”,将“result_code”放入“eventid”,将“message”放入“value”。然后,我们可以使用 Zabbix 源代码中提供的便利 misc/debug/sender.pl 脚本将此数据发送到 Zabbix 服务器:
$ cat mysql.json
{
"data": [
{
"clock": 1398753145,
"ns": 928525552,
"eventid": 12345,
"host": "MySQL Server",
"key": "eventlog[mysql.log]",
"lastlogsize": 1,
"severity": 1,
"source": "My Application",
"timestamp": 1375273705,
"value": "My Application was unable to ..."
}
],
"request": "agent data"
}
$ ./sender.pl -h 127.0.0.1 -p 10051 -i mysql.json
ZBXD^{
"response":"success",
"info":"processed: 1; failed: 0; total: 1; seconds spent: 0.000130"}
不过,有两个警告。一个是为了在 Zabbix 前端享受 Windows 事件日志功能(例如在“监控”->“最新数据”中显示 Windows 事件日志列),键应该以“eventlog[”开头。其次,“lastlogsize”应该随着您发送的每条记录而增加,但如果您将“log_id”用于“lastlogsize”,那将是自然而然的。
除此之外,您现在应该能够享受特定于 Windows 事件日志的 trigger functions,例如 logeventid()、logseverity() 和 logsource() 和 macros {ITEM.LOG.EVENTID}、{ITEM.LOG .SEVERITY} 和 {ITEM.LOG.SOURCE}。
项目的示例配置可能如下: