天天看点

zabbix日志监控

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)&amp;{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&amp;B:表示A、B都为真,才为真。即item返回数据中会包含"断开",则触发器被触发,30秒内没有新数据的话,触发器恢复。这样就保证了触发器不会一直在触发状态。

再来看一个例子

<code>{Template OS Linux:system.localtime.nodata(5m)}=1&amp;{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,如需转载请自行联系原作者

继续阅读