一、主動模式和被動模式介紹
要監控日志,必須使用主動模式,那么,什么是主動模式?什么是被動模式呢?
1、主動模式和被動模式
主動模式
主動模式通訊過程:
● Agent打開TCP連接(主動檢測變成Agent打開)
● Agent向Server請求items檢測列表
● Server返回items列表
● Agent 處理響應
● 關閉TCP連接
● Agent開始收集數據
主動檢測提交數據過程
● Agent建立TCP連接
● Agent提交items列表收集的數據
● Server處理數據,並返回響應狀態
● 關閉TCP連接
被動模式通信過程
● Server打開一個TCP連接
● Server發送請求agent.ping\n
● Agent接收到請求並且響應<HEADER><DATALEN>1
● Server處理接收到的數據1
● 關閉TCP連接
not supported items通信過程
● Server打開一個TCP連接
● Server發送請求vfs.fs.size[

● Agent接收請求並且返回響應數據 <HEADER><DATALEN>ZBX_NOTSUPPORTED\0Cannot obtain filesystem information: [2] No such file or directory
● Server接收並處理數據, 將item的狀態改為“ not supported ”
● 關閉TCP連接
二、日志監控原理及注意事項
0、Zabbix Server和Zabbix Agent會追蹤日志文件的大小和最后修改時間(對於logrt),並且分別記錄在字節計數器和最新的時間計數器中。
-
Agent還在內部使用inode編號(在UNIX/GNU/Linux上)、文件索引(在Microsoft Windows上)和前512個日志文件字節的MD5的求和,以便在日志文件被截斷和旋轉時改進決策。
-
在UNIX/GNU/Linux系統上,假定存儲日志文件的文件系統會報告索引節點號,它可用於跟蹤文件。
-
在Microsoft Windows上Zabbix代理確定日志文件所在的文件系統類型,並使用:
-
在NTFS文件系統上64位文件索引。
-
在ReFS文件系統(僅從Microsoft Windows Server 2012開始支持)128位文件ID。
-
在文件索引改變的文件系統(例如FAT32,exFAT)上,當日志文件旋轉導致具有相同最近修改時間的多個日志文件時,使用fall-back(回退)算法是在不確定的條件下采取的明智方法。
-
-
inode號,文件索引和MD5總和由Zabbix代理在內部收集。 它們不傳輸到Zabbix服務器,並且在Zabbix代理停止時丟失。
-
不要使用“touch”實用程序修改日志文件的最后修改時間,不要在以后恢復原始名稱的情況下復制日志文件(這將更改文件inode號)。 在這兩種情況下,文件將被視為不同的,將從頭開始進行分析,這可能會導致重復的告警。
-
如果logrt[]監控項有幾個匹配的日志文件,並且Zabbix代理程序跟隨其中最新的日志文件,同時最新的日志文件被刪除,則在“<目錄>”中會出現一條警告消息“沒有文件匹配”<regexp mask>“。 Zabbix代理將忽略修改時間小於最近日期的日志文件。
1、Agent會從上次讀取日志的地方開始讀取日志。
2、已經分析的字節數和最新時間計數器的數據會被記錄在Zabbix數據庫,並且發送給Agent,這樣能夠保證Agent從上次停止的地方開始讀取日志。
3、當日志文件大小小於Agent字節計數器中的數字時,字節計數器會變為0,從頭開始讀取文件。
4、如果目錄中存在多個匹配文件,且最后修改時間相同,則Agent會嘗試以相同的修改時間對所有日志文件進行正確分析,並避免跳過數據或分析相同的數據兩次(盡管有時不能保證)。Agent不承擔任何特定的日志文件輪詢方案。
當提供具有相同修改時間的多個日志文件時,Agent將以字典順序降序處理它們。 因此,對於某些輪詢方案,日志文件將按原始順序進行分析。對於其它輪詢方案,原始日志文件順序將不會被執行,這可能導致以更改順序報告匹配的日志文件記錄(如果日志文件的上次修改時間不同,則不會發生問題)。
5、所有符合配置的文件,都會被監控。
6、一個目錄下的多個文件如果修改時間相同,會按照字母順序來讀取。
7、到每個Update interval的時間時,Agent會檢查一次目錄下的文件。
8、Zabbix Agent每秒發送日志量,有一個日志行數上限,防止網絡和CPU負載過高,這個數字在zabbix_agentd.conf中的MaxLinePerSecond。
9、要找到所需的字符串,Zabbix將處理比MaxLinesPerSecond中設置的新行多4倍。 因此,如果log[]或logrt[]監控項的更新間隔為1秒,則默認情況下,Agent將分析小於80個日志文件記錄,並在一次檢查中向Zabbix服務器發送不超過20個匹配記錄。通過在Agent配置文件中增加MaxLinesPerSecond或在監控項Key中設置maxlines參數,可以在一次檢查中將限制最多增加4000個分析的日志文件記錄和1000個匹配記錄發送到Zabbix服務器。如果更新間隔設置為2秒,則一次檢查的限制將被設置為更新間隔1秒的2倍。
10、此外,日志和日志計數值始終限於代理發送緩沖區大小的50%,即使其中沒有非日志值。 因此,為了在一個連接(而不是幾個連接)中發送最大值,代理BufferSize參數必須至少為maxlines x 2。
11、對大於256kB的日志文件記錄,只有第一個256kB與正則表達式匹配,其余的記錄將被忽略。 但是,如果Zabbix代理在處理長記錄時停止,代理內部狀態將丟失,並且可以在代理重新啟動后再次分析不同的長記錄。
12、“\”路徑分隔符的特殊注意事項:如果file_format是“file\.log”,則不應該有“file”目錄,因為不可能明確地定義是否轉義了“.”,以及是否為第一個文件名符號。
13、僅在文件名中支持logrt的正則表達式,不支持目錄正則表達式匹配。
14、在UNIX平台上,如果要找的日志文件的目錄不存在,則logrt[]監控項將變為NOTSUPPORTED。
15、在Microsoft Windows上,如果目錄不存在,則監控項將不會變為NOTSUPPORTED(例如,如果目錄在監控項Key中拼寫錯誤)。
16、沒有用於logrt[]監控項的日志文件不會使其NOTSUPPORTED。讀取logrt[]監控項的日志文件的錯誤將作為告警記錄到Zabbix代理日志文件中,但不要使監控項NOTSUPPORTED。
17、Zabbix代理日志文件可以幫助你找出為什么log[]或logrt[]監控項成為NOTSUPPORTED。Zabbix可以監視其代理日志文件,除了在DebugLevel=4時。
18、在logtr中,正則表達式只對文件名有效,對文件目錄無效。
三、日志監控項介紹
針對日志監控,zabbix在3.2以前有2個專門的監控項:log和logtr,在3.2以后新增了2個log.count和logtr.count。
log[/path/to/some/file,<regexp>,<encoding>,<maxlines>,<mode>,<output>]
logtr[/path/to/some/filename_format,<regexp>,<encoding>,<maxlines>,<mode>,<output>]
◆/path/to/some/file:要監控的日志文件
◆ regexp:要匹配內容的正則表達式,或者直接寫你要檢索的內容也可以,例如我想檢索帶ERROR關鍵詞的記錄
◆ encoding:編碼相關,留空即可
◆ maxlines:一次性最多提交多少行,這個參數覆蓋配置文件zabbxi_agentd.conf中的’MaxLinesPerSecond’,這里優先級比配置文件里面的高,我們也可以留空
◆ mode:默認是all,也可以是skip,skip會跳過老數據
◆ output:輸出給zabbix server的數據。可以是\1、\2一直到\9,\1表示第一個正則表達式匹配出得內容,\2表示第二個正則表達式匹配得出的內容。
注意:
1、logtr的第一個參數是文件名的格式,可以是正則表達式,主要用於針對輪詢或滾動日志使用,比如我們日常的程序日志:gameserver.20180102.log、gameserver.20180103.log、gameserver.20180104.log......
2、不管新日志、老日志,只要他們有變更,zabbix都會監控。
3、只要配置了<regexp>,Zabbix會根據<regexp>的正則表達式來匹配日志中的內容。
4、一定要保證Zabbix用戶對日志文件有可讀權限,否則這個Item的狀態會變成“unsupported”。
四、范例
配置前,請確保Agent有如下兩項配置
1、Hostname設定為Server創建主機是填寫的Host name,必須一致
2、ServerActive設定為Server的IP
一、log[/path/to/some/file,<regexp>,<encoding>,<maxlines>,<mode>,<output>]
配置步驟
1、Web端配置監控項
2、Agent端配置Hostname
這里一定要和web端的主機名一致!!!!!!!!!
3、測試並查看結果
我們這里是測試通過rz上傳文件后,會在messages里面出現rz字符串。
查看最新數據:
二、logtr[/path/to/some/filename_format,<regexp>,<encoding>,<maxlines>,<mode>,<output>]
配置步驟基本上和log一樣。
1、配置監控項
2、查看結果
五、主動模式log分析
主動模式第一階段:(請求items,並准備采集數據)
1.Agent向ServerActive機器發起請求
20674:20160728:155754.489 active checks #1 [getting list of active checks]
20674:20160728:155754.489 In refresh_active_checks() host:'192.168.1.100' port:10051
20674:20160728:155754.490 sending [{
"request":"active checks",
"host":"192.168.1.100",
"host_metadata":"Linux bgp-bjzw-zabbix-server02.xsjom.cn 2.6.32-431.20.3.el6.x86_64 #1 SMP Thu Jun 19 21:14:45 UTC 2014 x86_64"}]
2.ServerActive響應后,Agent獲得從ServerActive返回的items列表
20674:20160728:155754.490 before read
20666:20160728:155754.493 collector [processing data]
20666:20160728:155754.493 In update_cpustats()
20666:20160728:155754.493 End of update_cpustats()
20666:20160728:155754.493 collector [idle 1 sec]
20674:20160728:155754.494 got [{"response":"success","data":[{"key":"log[/var/log/messages,charts,,,skip,]","delay":10,"lastlogsize":19499,"mtime":0}]}]
3.關閉TCP連接,准備收集數據
20674:20160728:155754.494 In parse_list_of_checks()
20674:20160728:155754.494 In disable_all_metrics()
20674:20160728:155754.495 In add_check() key:'log[/var/log/messages,charts,,,skip,]' refresh:10 lastlogsize:19499 mtime:0
20674:20160728:155754.495 End of add_check()
20674:20160728:155754.495 End of refresh_active_checks():SUCCEED
主動模式第二階段:(agent提交items數據,ActiveServer處理並回應結果)
1.Agent獲取itmes列表后,處理里面的items
20674:20160728:155754.495 active checks #1 [processing active checks]
20674:20160728:155754.495 In process_active_checks() server:'192.168.1.100' port:10051)
20674:20160728:155754.495 In process_logrt() is_logrt:0 filename:'/var/log/messages' lastlogsize:19499 mtime:0 error_count:0
20674:20160728:155754.496 In add_logfile() filename:'/var/log/messages' mtime:1469692670 size:19586
20674:20160728:155754.496 add_logfile() logfiles:0x282e540 logfiles_alloc:64
20674:20160728:155754.496 End of add_logfile()
20674:20160728:155754.496 setup_old2new: is_same_file(/var/log/messages, /var/log/messages) = 1
1.1.處理老的文件
20674:20160728:155754.496 process_logrt() old file list:
20674:20160728:155754.496 nr:0 filename:'/var/log/messages' mtime:1469692248 size:19499 processed_size:19499 seq:1 incomplete:0 dev:64768 ino_hi:0 ino_lo:652985 md5size:512 md5buf:b2f842e0e504b09c8cac18795a66bc93
1.2處理新的文件
20674:20160728:155754.496 process_logrt() new file list: (mtime:0 lastlogsize:19499 start_idx:0)
20674:20160728:155754.496 nr:0 filename:'/var/log/messages' mtime:1469692670 size:19586 processed_size:19499 seq:0 incomplete:0 dev:64768 ino_hi:0 ino_lo:652985 md5size:512 md5buf:b2f842e0e504b09c8cac18795a66bc93
1.3獲取符合要求結果的數據值
20674:20160728:155754.496 In process_log() filename:'/var/log/messages' lastlogsize:19499 mtime: 0
20674:20160728:155754.497 In process_value() key:'192.168.1.100:log[/var/log/messages,charts,,,skip,]' value:'Jul 28 15:57:50 localhost rz[23429]: [root] charts.html/ZMODEM: 9976 Bytes, 102576 BPS'
20674:20160728:155754.497 In send_buffer() host:'192.168.1.100' port:10051 values:0/100
20674:20160728:155754.497 End of send_buffer():SUCCEED
20674:20160728:155754.497 buffer: new element 0
20674:20160728:155754.497 End of process_value():SUCCEED
20674:20160728:155754.497 End of process_log() filename:'/var/log/messages' lastlogsize:19586 mtime: 0 ret:SUCCEED
20674:20160728:155754.497 End of process_logrt():SUCCEED error_count:0
20674:20160728:155754.497 End of process_active_checks()
20674:20160728:155754.497 In get_min_nextcheck()
20674:20160728:155754.498 active checks #1 [idle 1 sec]
20666:20160728:155755.494 collector [processing data]
20666:20160728:155755.494 In update_cpustats()
20666:20160728:155755.494 End of update_cpustats()
20666:20160728:155755.495 collector [idle 1 sec]
1.4發送數據給ActiveServer
20674:20160728:155755.498 In send_buffer() host:'192.168.1.100' port:10051 values:1/100
20674:20160728:155755.499 JSON before sending [{
"request":"agent data",
"data":[
{
"host":"192.168.1.100",
"key":"log[\/var\/log\/messages,charts,,,skip,]",
"value":"Jul 28 15:57:50 localhost rz[23429]: [root] charts.html\/ZMODEM: 9976 Bytes, 102576 BPS",
"lastlogsize":19586,
"clock":1469692674,
"ns":497558898}],
"clock":1469692675,
"ns":498717648}]
2.ActiveServer回應收到數據,並返回狀態
20674:20160728:155755.499 JSON back [{"response":"success","info":"processed: 1; failed: 0; total: 1; seconds spent: 0.000101"}]
20674:20160728:155755.499 In check_response() response:'{"response":"success","info":"processed: 1; failed: 0; total: 1; seconds spent: 0.000101"}'
20674:20160728:155755.500 info from server: 'processed: 1; failed: 0; total: 1; seconds spent: 0.000101'
20674:20160728:155755.500 End of check_response():SUCCEED
20674:20160728:155755.500 OK
20674:20160728:155755.500 End of send_buffer():SUCCEED
20674:20160728:155755.500 active checks #1 [idle 1 sec]