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,如需轉載請自行聯系原作者