有些应用程序会每天生成一个当天日期命名的日志文件,对应日志文件里面出现的报错信息要进行实时监控,实际的过程中遇到了很多坑,总结记录下来,供以后参考。

监控设备是多台win机器,而每个win机器上有多个路径不一的日志目录,目录都含有中文。每个目录下每天都会生成一个新的日期命名的log文件,而目前所要做的是对每个日志文件中的多个关键字进行监控告警。

有几个需要思考的地方:

  • 多个机器多个目录肯定是需要通过模板和自动发现的方式
  • 涉及到win机器并且包含中文,涉及到字符集转码的问题
  • 多个关键字正则表达式处理
  • 如何最简化部署的工作

配置自动发现

这里选择了一种比较简单的方式,通过自带的system.run进行文件路径的获取,将每台设备的目录手动记录在一个文本文件当中,然后通过system.run的方式去读取到,接着通过preprocessing的js进行处理生成json格式的返回结果,然后将每个目录路径作为变量来交给后面的步骤。这样就不用在每台机器上去部署脚本和新增userparameter,简化操作。

基于system.run key创建发现规则:

system.run["type c:\zabbix\scripts\test.cfg"]

添加javascript预处理步骤,将文件list转换成Zabbix低级别发现数据:

var lld = [];
var lines = value.split("\n");
var lines_num = lines.length;
for (i = 0; i < lines_num; i++)
{
var row = {};
row["{#LOGFILE}"] = lines[i]
lld.push(row);
}
return JSON.stringify(lld);

脚本获取文件list和命令输出,并转化成json格式:

[
 {
   "{#FILE}": "<full path to file>"
 },
 {
   "{#FILE}": "<full path to file>"
 }
]

这里就遇到过好几个大坑,第一个是test.cfg必须是utf8格式,否则中文会乱码。第二就是windows下面的换行是\r\n,而不是linux系统中的\n,所以通过js生成的json串中路径最后面总是会多一个隐藏的空格,导致监控项没有报错,但是始终监控不到日志数据。

所以需要在notepad中手动进行\r的替换

配置监控项

名称:日志监控[{#LOGFILE}]

type:zabbix agent (active)

key: logrt["{#LOGFILE}\[0-9]{8}.log","异常|错误","GB2312",,skip,,,]

这里遇到的坑就是encoding的问题,日志文件试了很多个字符集,最后还是通过notepad打开时才发现是GB2312,这样才能正确识别日志文件当中的中文。

配置触发器

表达式:

{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机器加上模板即可。