Zabbix可以使用log监控类型来监控日志文件。
在配置Item的时候,Type选择Zabbix agent (active),这里主要需要配置的是Key。下面是监控日志的两种key——log和logtr。
log[/path/to/some/file,<regexp>,<encoding>,<maxlines>,<mode>,<output>]
logtr[/path/to/some/filename_format,<regexp>,<encoding>,<maxlines>,<mode>,<output>]
◆ regexp:要匹配内容的正则表达式,或者直接写你要检索的内容也可以,例如我想检索带ERROR关键词的记录
◆ encoding:编码相关,留空即可
◆ maxlines:一次性最多提交多少行,这个参数覆盖配置文件zabbxi_agentd.conf中的’MaxLinesPerSecond’,我们也可以留空
◆ mode:默认是all,也可以是skip,skip会跳过老数据
◆ output:输出给zabbix server的数据。可以是\1、\2一直\9,\1表示第一个正则表达式匹配出得内容,\2表示第二个正则表达式匹配错的内容。
如果仔细看可以发现,第一个参数不一样,logrt的第一个参数可以使用正则表达式。针对日志回滚用得,例如我们每天都切割nginx日志,日志名位www.a.com_2015-01-01.log、www.a.com_2015-01-02.log等等,使用log肯定不合适,如果文件名使用正则,那么新增的日志文件会立即加入监控。
备注:不管新日志、老日志,只要他们有变更,zabbix都会监控。
只要配置了<regexp>,Zabbix会根据<regexp>的正则表达式来匹配日志中的内容。注意,一定要保证Zabbix用户对日志文件有可读权限,否则这个Item的状态会变成“unsupported”。
注意事项:
1、Zabbix Server和Zabbix Agent会追踪日志文件的大小和最后修改时间,并且分别记录在字节计数器和最新的时间计数器中。
2、Agent会从上次读取日志的地方开始读取日志。
3、字节计数器和最新时间计数器的数据会被记录在Zabbix数据库,并且发送给Agent,这样能够保证Agent从上次停止的地方开始读取日志。
4、当日志文件大小小于字节计数器中的数字时,字节计数器会变为0,从头开始读取文件。
5、所有符合配置的文件,都会被监控。
6、一个目录下的多个文件如果修改时间相同,会按照字母顺序来读取。
7、到每个Update interval的时间时,Agent会检查一次目录下的文件。
8、Zabbix Agent每秒发送日志量,有一个日志行数上限,防止网络和CPU负载过高,这个数字在zabbix_agentd.conf中的MaxLinePerSecond。
9、在logtr中,正则表达式只对文件名有效,对文件目录无效。
监控案例:
公司的云泊系统中会记录Pms终端连接的三种状态,
1、断开连接
2、连接成功
3、重连成功
这些日志使我们想要获取到的。其他的是一些Debug日志和Error日志,这些我们不关心
所以我们需要将需要监控的日志获取到。以下是我们想要获取的日志信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<code>ApiServer | 2016-07-12 10:18:49.509 | INFO | send mail successfully, content:2016-07-12 10:18:47, 停车场:智慧园停车场重连成功</code>
<code>ApiServer | 2016-07-12 10:02:10.576 | INFO | send mail successfully, content:2016-07-12 10:02:08, 停车场:智慧园停车场重连成功</code>
<code>ApiServer | 2016-07-12 11:14:15.021 | INFO | send mail successfully, content:2016-07-12 11:14:13, 停车场:智慧园停车场重连成功</code>
<code>ApiServer | 2016-07-12 11:18:33.241 | INFO | send mail successfully, content:2016-07-12 11:18:30, 停车场:智慧园停车场重连成功</code>
<code>ApiServer | 2016-07-12 12:04:49.299 | INFO | send mail successfully</code>
<code>ApiServer | 2016-07-12 11:22:13.236 | INFO | send mail successfully, content:2016-07-12 11:22:11, 停车场</code>
<code>ApiServer | 2016-07-12 12:33:22.945 | INFO | send mail successfully, content:2016-07-12 12:33:21, 智慧园停车场连接断开</code>
<code>ApiServer | 2016-07-12 03:29:51.751 | INFO | send mail successfully, content:2016-07-12 03:29:50, 智慧园停车场连接断开</code>
<code>ApiServer | 2016-07-12 04:14:09.640 | INFO | send mail successfully, content:2016-07-12 04:14:08, 智慧园停车场连接断开</code>
<code>ApiServer | 2016-07-12 05:45:17.496 | INFO | send mail successfully, content:2016-07-12 05:45:16, 智慧园停车场连接断开</code>
<code>ApiServer | 2016-07-12 07:53:22.012 | INFO | send mail successfully, content:2016-07-12 07:53:20, 智慧园停车场连接断开</code>
<code>ApiServer | 2016-07-12 08:24:52.001 | INFO | send mail successfully, content:2016-07-12 08:24:50, 智慧园停车场连接断开</code>
<code>ApiServer | 2016-07-12 12:33:28.890 | INFO | send mail successfully, content:2016-07-12 12:33:27, 停车场:智慧园停车场连接成功</code>
<code>ApiServer | 2016-07-12 09:53:49.780 | INFO | send mail successfully, content:2016-07-12 09:53:48, 停车场:智慧园停车场重连成功</code>
创建监控项:
注意:我这里是测试环境,并非生产环境。
<a href="http://s5.51cto.com/wyfs02/M00/84/0F/wKioL1eEmuPg_I3zAAI1jS1y4nw976.png" target="_blank"></a>
这里我匹配的关键字是停车场
创建trigger:
<a href="http://s1.51cto.com/wyfs02/M02/84/0F/wKioL1eEm0SxaOQiAAHLLmzGkzI213.png" target="_blank"></a>
Trigger的解释:
<code>(({10.10.10.202:log[</code><code>/mnt/test</code><code>.log,停车场,,,,].regexp(断开)})</code><code>#0)&{10.10.10.202:log[/mnt/test.log,停车场,,,,].nodata(30)}=0</code>
A:
<code>(({10.10.10.202:log[</code><code>/mnt/test</code><code>.log,停车场,,,,].regexp(断开)})</code><code>#0)</code>
log中包含了‘停车场’且包含‘断开’字符串,则表达式为真。
B:
<code>{10.10.10.202:log[</code><code>/mnt/test</code><code>.log,停车场,,,,].nodata(30)}=0</code>
表示30秒内有数据产生则表达式为真,即30秒内如果没有新数据了,则表达式为假。为假,则告警恢复了。
A&B:表示A、B都为真,才为真。即item返回数据中会包含"断开",则触发器被触发,30秒内没有新数据的话,触发器恢复。这样就保证了触发器不会一直在触发状态。
再来看一个例子
<code>{Template OS Linux:system.localtime.nodata(5m)}=1&{Template OS Linux:icmpping.last(0)}=1</code>
这个是zabbix自带的linux os template中的一个监控项,
<code>system.localtime.nodata(5m)}=1</code>
表示5分钟内没有数据为真,注意等号后面是1.
这里有一个问题:如果系统产生一条日志被匹配到了,触发了告警。此时告警没有恢复,那么接下来的30秒之类如果还有日志被匹配到了,那么它是不会触发告警的。而nodata的时间间隔最少为30秒,所以我们无法通过调整时间来解决这个问题。那么我们可以通过创建多个trigger来解决这个问题。
前面说了状态有三种,所以我们创建的trigger有3个,这样能保证每一个状态的日志都能触发告警。
下面是另外两个状态的trigger
<a href="http://s2.51cto.com/wyfs02/M01/84/10/wKiom1eEoabBIIGjAADmqtEnhqk064.png" target="_blank"></a>
<a href="http://s2.51cto.com/wyfs02/M02/84/10/wKioL1eEoabg0cQCAADoK_FfHX4626.png" target="_blank"></a>
本文转自 曾哥最爱 51CTO博客,原文链接:http://blog.51cto.com/zengestudy/1825761,如需转载请自行联系原作者