1. 日志文件监控原理
通过zabbix agentd程序按照zabbix server上配置的item更新时间间隔和规则去检索指定的日志文件,找出与定义的模式(pattern)相匹配的字符串(行),然后将其送给zabbix server进行分析处理,zabbix
server根据预先设置的trigger及时提供预警信息。 不对日志信息进行过滤直接送给zabbix server也行,但明显不合适。
2. 监控日志文件的相关细节
监控日志文件的要点:
- 当使用logrt时,zabbix server和agent会对日志文件的大小和最后修改时间进行追踪,分别对应不同的counter。
- agent内部在Unix/GNU/Linux中使用inode number,在MS Windows中使用文件索引,以及日志文件的前512字节的MD5 sum值来追踪文件。文件在切割时这些信息会改变。
- 在Unix/GNU/Linux系统中会假定文件的inode number可以用来追踪文件。
- 在Windows系统上不同的文件系统使用不同的追踪方式。
- NTFS文件系统上使用64位的文件索引。
- ReFS(Windows Server 2012)上使用128位的文件ID。
- 日志文件的inode number,文件索引和MD5 sum都只由zabbix agent收集,它们不会传递给server,当zabbix_agentd停止的时候,它们会丢失。
- 不要使用
touch
指令修改日志文件的最后修改时间, do not copy a log file with later restoration of the original name,其实就是不要对日志文件进行一些会改变其inode number的操作。否则会导致agent重新开始分析文件,会导致告警重复。 - 如果有多个匹配的日志文件,zabbix agent只会分析最新的一个匹配的日志文件,如果最新的日志文件被删除了,会产生告警信息。
- agent会从它上次停止的时间点开始读取日志文件。
- server会将已经分析过的日志文件的字节数(the size counter)和最后的修改时间(the time counter)存储到zabbix database中,在agent刚启动或者收到某item之前是禁用或者不支持现在启用了时,发送给agent便于它从指定位置开始读取日志文件。
- 无论何时当日志文件的大小变得比agent知道的要小时,the size counter会重置为0,然后agent会根据the time counter的记录开始读取日志文件。
- 如果有多个匹配的文件,它们的最后修改时间相同时,agent会分析所有的文件,并避免跳过数据,或者分析相同数据2次。
- zabbix agent按照定义的Update interval seconds时间间隔分析日志文件的新记录。
- zabbix agent会一秒最多发送key中定义的
maxlines
行的日志文件给server,这个参数会覆盖agnetd配置文件中的MaxLinesPerSecond
参数的配置。 - 默认情况下,agent在一次检测中最多可以分析80条日志文件记录,并且发送最多20条匹配的记录给server。
maxlines
可以增加到4000,这样可以一次检测时发送1000条日志记录给server。 - log和log.count的值总是被限制在agent send buffer size的50%。所以
maxlines
会被一次发送完成,agent的BufferSize参数最少为maxlines x2。 - 日志文件记录超过了256kB时,剩下的部分将会被忽略。(应该是文件的增量?)
- logrt匹配置日志文件名时,其路径不能使用正则表达式匹配,只能用正则表达式匹配文件名。
- logr[] item找不到的日志文件,不会标示item为NOTSUPPORTED。读取日志文件发生错误会以警告信息记录到agent的日志中,但也不会标示这一item为NOTSUPPORTED。
- zabbix agent的日志文件,对查找log[]或logrt[] item变得NOTSUPPORTED时很有帮助。只要agent日志文件不设置在Debuglevel=4时,zabbix可以监控agent日志文件。被标示为NOTSUPPORTED的item在item中查看会有显示,在Latest data中查看时该item会显示为灰色。
- 如果server(proxy)和agent的通信中断,对于日志文件的检测将会停止,但通信恢复后,检测也会恢复,同时继续从之前检测过的位置开始检测,不会漏掉匹配的信息,只不过会延后。
- server(proxy)和agent通信中断,agent它也会保持和日志文件的联系。
- maxdelay如果保持默认(maxdelay=0),当server和agent通信中断恢复后,agent会将之前log.count和logrt.count计数和新匹配的计数一起发送给server。
- maxdelay如果大于0,且log file没有行被跳过,则和上面一样将新旧count一起发送给server,如果log file有行被跳过,则之前的count结果将会被丢弃。
3. 日志文件监控类型
3.1 常用的日志监控item key类型
- log[/path/to/file/file_name,<regexp>,<encoding>,<maxlines>,<mode>,<output>,<maxdelay>]
- logrt[/path/to/file/regexp_describing_filename_pattern,<regexp>,<encoding>,<maxlines>,<mode>,<output>,<maxdelay>]
- log.count[/path/to/file/file_name,<regexp>,<encoding>,<maxproclines>,<mode>,<maxdelay>]
- logrt.count[/path/to/file/regexp_describing_filename_pattern,<regexp>,<encoding>,<maxproclines>,<mode>,<maxdelay>]
3.2 key参数的含义
-
/path/to/file/file_name
表示日志文件的绝对路径。 -
regexp
表示用于匹配特定字符串的正则表达式,如果留空会将整个日志文件记录发给server。 -
encoding
表示日志文件记录的编码格式,一般留空,使用日志文件的默认格式。 -
maxproclines
表示agent一次可以发送最多多少条日志记录给server。 -
output
表示只将与正则表达式匹配的字符串发给server,而非整行记录。 -
maxdelay
这一参数用于允许跳过日志中一些陈旧的记录,以找到最新的日志记录,这个跳过时长即为maxdelay
。这有可能会导致忽略了一些重要日志。所以谨慎使用,一般保持默认值0即可。 -
mode
表示处理数据的模式,默认为all,也可以是skip,表示跳过老数据。
3.3 监控不同类型的日志文件
- log用于监控日志文件名称不会变化的场景。
- logrt用于监控日志文件名会变化的场景,如会自动切割的带有日期的文件名。
- count用于统计相应日志文件中含有匹配字符的日志行数。
4. 日志文件监控item参数选择及含义
字段 | 选择及含义 |
---|---|
Type | Zabbix agent(active),让agentd主动上报信息 |
Type of information | log和logrt时选择Log,log.count和logrt.count时选择numeric(unsigned) |
Update interval in sec | 定义agnet检测日志文件的间隔时长,检测出日志文件的变化 |
Log time format | 用字母yMdhms分别表示年月日时分秒,用字符p和:代表占位符,当日志的时间戳有空格或者其它item里表示不出来的时间日期时可以用它们代替,如表星期的Mon,直接用ppp代替即可 |
5. 小结
使用zabbix监控日志文件,把握两个要点:
- 确保zabbix对要监控的日志文件有读取权限。
- 监控item配置正确。