Zabbix Logrt Monitoring Windows Logs
有些应用程序会每天生成一个当天日期命名的日志文件,对应日志文件里面出现的报错信息要进行实时监控,实际的过程中遇到了很多坑,总结记录下来,供以后参考。
监控设备是多台win机器,而每个win机器上有多个路径不一的日志目录,目录都含有中文。每个目录下每天都会生成一个新的日期命名的log文件,而目前所要做的是对每个日志文件中的多个关键字进行监控告警。
有几个需要思考的地方:
- 多个机器多个目录肯定是需要通过模板和自动发现的方式
- 涉及到win机器并且包含中文,涉及到字符集转码的问题
- 多个关键字正则表达式处理
- 如何最简化部署的工作
配置自动发现
这里选择了一种比较简单的方式,通过自带的system.run进行文件路径的获取,将每台设备的目录手动记录在一个文本文件当中,然后通过system.run的方式去读取到,接着通过preprocessing的js进行处理生成json格式的返回结果,然后将每个目录路径作为变量来交给后面的步骤。这样就不用在每台机器上去部署脚本和新增userparameter,简化操作。
基于system.run key创建发现规则:
1 | system.run["type c:\zabbix\scripts\test.cfg"] |
添加javascript预处理步骤,将文件list转换成Zabbix低级别发现数据:
1 | var lld = []; |
脚本获取文件list和命令输出,并转化成json格式:
1 | [ |
这里就遇到过好几个大坑,第一个是test.cfg必须是utf8格式,否则中文会乱码。第二就是windows下面的换行是\r\n,而不是linux系统中的\n,所以通过js生成的json串中路径最后面总是会多一个隐藏的空格,导致监控项没有报错,但是始终监控不到日志数据。
所以需要在notepad中手动进行\r的替换
配置监控项
1 | 名称:日志监控[{#LOGFILE}] |
这里遇到的坑就是encoding的问题,日志文件试了很多个字符集,最后还是通过notepad打开时才发现是GB2312,这样才能正确识别日志文件当中的中文。
配置触发器
表达式:
1 | {template_wg_log:logrt["{#LOGFILE}\[0-9]{8}.log","异常|错误","GB2312",,skip,,,].iregexp(异常|错误)}=1 and {template_wg_log:logrt["{#LOGFILE}\[0-9]{8}.log","异常|错误","GB2312",,skip,,,].nodata(5m)}=0 |
接下来就是给每台win机器加上模板即可。
Zabbix Logrt Monitoring Windows Logs
https://www.xbdba.com/2020/07/28/zabbix-logrt-monitoring-windows-logs/