Zabbix整合ELK實現日誌數據的分析實時監控

一,ELK和Zabbix的關係?
ELK是一套組合的日誌收集系統,由Elasticsearch、Logstash和Kibana三個軟件組成,通過ELK可以收集系統日誌、網站日誌、應用系統日誌等各種日誌數據,並且還可以對日誌進行過濾、篩選,然後進行集中存放並可用於實時檢索、分析。這是ELK的基礎功能。

但是如果我們希望在收集日誌的時候,能把異常的日誌信息(錯誤,失敗)等等提取出來及時發送給運維人員,那麼運維就能第一時間的去排查和處理故障,避免很多故障的發生。

那麼就可以用zaibbix其實更應該說是(logstash/filebeat)由它來實時讀取日誌的內容,並且還可以過濾日誌信息。通過ELK的讀取和篩選過濾等功能,就可以把日誌中的一些異常關鍵字(error、failed、OutOff、Warning)過濾出來,然後通過logstash的zabbix插件將該錯誤日誌發送到zabbix服務端,那麼zabbix在接收到這個數據之後,就可以根據自己定義的報警方式來進行報警處理。
二、Logstash與zabbix插件的使用
logstash支持多種輸出介質,例如TCP,HTTP,elasticsearch,kafka,Redis,Nagios,zabbix,syslog等,那麼我們想將收集到的日誌中一些錯誤信息輸出,並報警時,就用到了logstash-output-zabbix這個插件,該插件可以將Logstash與zabbix進行整合,其實就是將logstash收集到的數據進行過濾,把有錯誤標識的日誌輸出到zabbix中,最後在通過zabbix的報警機制進行觸發,報警。

logstash-output-zabbix是一個社區維護的插件,它默認沒有在Logstash中安裝,但是安裝起來也很容易,直接在logstash中運行如下命令即可:

/usr/local/logstash/bin/logstash-plugin install logstash-output-zabbix

2.1、列出目前已經安裝的插件

將列出所有已安裝的插件
/usr/local/logstash/bin/logstash-plugin list

#將列出已安裝的插件及版本信息

/usr/local/logstash/bin/logstash-plugin list --verbose

#將列出包含namefragment的所有已安裝插件

/usr/local/logstash/bin/logstash-plugin list "zabbix"

#將列出特定組的所有已安裝插件( input,filter,codec,output)

/usr/local/logstash/bin/logstash-plugin list --group input

2.2、安裝插件
要安裝某個插件,例如安裝kafka插件,可執行如下命令:

/usr/local/logstash/bin/logstash-plugin install logstash-output-kafka

PS:前提是能上網此插件安裝方法,會檢索托管在公共存儲庫(RubyGems.org)上的插件,然後下載到本地機器並在Logstash安裝之上進行自動安裝。
2.3、更新插件
每個插件有自己的發佈週期和版本更新,這些更新通常是獨立於Logstash的發佈週期的。因此,有時候需要單獨更新插件,可以使用update子命令獲得最新版本的插件。

將更新所有已安裝的插件
/usr/local/logstash/bin/logstash-plugin update
將僅更新指定的插件
/usr/local/logstash/bin/logstash-plugin update logstash-output-kafka

2.4、刪除插件
如果需要從Logstash插件中刪除插件,可執行如下命令:

/usr/local/logstash/bin/logstash-plugin remove logstash-output-kafka

這樣就刪除了logstash-output-kafka插件。
三、logstash-output-zabbix插件的使用
logstash-output-zabbix安裝好之後,就可以在logstash配置文件中使用了,
下面是一個logstash-output-zabbix使用的例子:

zabbix {
        zabbix_host => "[@metadata][zabbix_host]"
        zabbix_key => "[@metadata][zabbix_key]"
        zabbix_server_host => "x.x.x.x"
        zabbix_server_port => "xxxx"
        zabbix_value => "xxxx"
        }

其中:
zabbix_host:表示Zabbix主機名字段名稱, 可以是單獨的一個字段, 也可以是 @metadata 字段的子字段, 是必需的設置,沒有默認值。

zabbix_key:表示Zabbix項目鍵的值,也就是zabbix中的item,此字段可以是單獨的一個字段, 也可以是 @metadata 字段的子字段,沒有默認值。

zabbix_server_host:表示Zabbix服務器的IP或可解析主機名,默認值是 “localhost”,需要設置爲zabbix server服務器所在的地址。

zabbix_server_port:表示Zabbix服務器開啓的監聽端口,默認值是10051。

zabbix_value:表示要發送給zabbix item監控項的值對應的字段名稱,默認值是 “message”,也就是將"message"字段的內容發送給上面zabbix_key定義的zabbix item監控項,當然也可以指定一個具體的字段內容發送給zabbix item監控項。
四、將logstash與zabbix進行整合
這裏我們以logstash收集日誌,然後對日誌進行讀取,最後選擇關鍵字進行過濾並調用zabbix告警的流程,來看看如何配置logstash實現zabbix告警。
需求:
通過對系統日誌文件進行監控,然後去過濾日誌信息中的一些關鍵字,例如ERR、error、ERROR、Failed、WARNING等,將日誌中這些信息過濾出來,然後發送到zabbix上,最後藉助zabbix的報警功能實現對系統日誌中有上述關鍵字的報警。
對於過濾關鍵字,進行報警,不同的業務系統,可能關鍵字不盡相同,例如對http系統,可能需要過濾500、403、503等這些錯誤碼,對於java相關的系統,可能需要過濾OutOfMemoryError、PermGen、Java heap等關鍵字。在某些業務系統的日誌輸出中,可能還有一些自定義的錯誤信息,那麼這些也需要作爲過濾關鍵字來使用。
4.1、配置logstash事件配置文件
可以查看/usr/local/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-patterns-core-4.1.2/patterns/grok-patterns文件來判斷有哪些匹配的文件。

接下來就是創建一個logstash事件配置文件,這裏將配置文件分成三個部分來介紹,首先是input部分,內容如下:

vim /usr/local/logstash/config/zabbix_output.conf
input {
        file {
        path => ["/var/log/secure"]
        type => "system"
        start_position => "beginning"
        }
}
#input部分是從/var/log/secure文件中讀取數據,start_position 表示從secure文件開頭讀取內容。

接着是filter部分,內容如下:

filter {
    grok {
             match => { "message" => "%{SYSLOGTIMESTAMP:message_timestamp} %{SYSLOGHOST:hostname} %{DATA:message_program}(?:\[%{POSINT:message_pid}\])?: %{GREEDYDATA:message_content}" }        #這裏通過grok對message字段的數據進行字段劃分,這裏將message字段劃分了5個子字段。其中,message_content字段會在output中用到。
        }

      mutate {
             add_field => [ "[zabbix_key]", "oslogs" ]      #新增的字段,字段名(key)是zabbix_key,值爲oslogs。
             add_field => [ "[zabbix_host]", "%{host}" ]   #新增的字段,字段名(key)是zabbix_host,值可以在這裏直接定義,也可以引用字段變量來獲取。這裏的%{host}獲取的就是日誌數據的主機名,這個主機名與zabbix web中“主機名稱”需要保持一致。
         }
        mutate {        #這裏是刪除不需要的字段
            remove_field => "@version"
            remove_field => "message"
        }
        date {      #這裏是對日誌輸出中的日期字段進行轉換,其中message_timestamp字段是默認輸出的時間日期字段,將這個字段的值傳給 @timestamp字段。
                match => [ "message_timestamp","MMM  d HH:mm:ss", "MMM dd HH:mm:ss", "ISO8601"]
        }
}

filter部分是個重點,在這個部分中,重點關注的是message_timestamp字段、message_content字段。
最後是output部分,內容如下:

output {
        if [message_content]  =~ /(ERR|error|ERROR|Failed)/  {      #定義在message_content字段中,需要過濾的關鍵字信息,也就是在message_content字段中出現給出的這些關鍵字,那麼就將這些信息發送給zabbix。
              zabbix {
                        zabbix_host => "[zabbix_host]"      #這個zabbix_host將獲取上面filter部分定義的字段變量%{host}的值
                        zabbix_key => "[zabbix_key]"        #這個zabbix_key將獲取上面filter部分中給出的值
                        zabbix_server_host => "192.168.2.3"  #這是指定zabbix server的IP地址
                        zabbix_server_port => "10051"           #這是指定zabbix server的監聽端口
                        zabbix_value => "message_content"              #這個很重要,指定要傳給zabbix監控項item(oslogs)的值, zabbix_value默認的值是"message"字段,因爲上面我們已經刪除了"message"字段,因此,這裏需要重新指定,根據上面filter部分對"message"字段的內容劃分,這裏指定爲"message_content"字段,其實,"message_content"字段輸出的就是服務器上具體的日誌內容。
                        }
                    }
              stdout { codec => rubydebug }   #這裏是開啓調試模式,當第一次配置的時候,建議開啓,這樣過濾後的日誌信息直接輸出的屏幕,方便進行調試,調試成功後,即可關閉。
}

將上面三部分內容合併到一個文件zabbix_output.conf中,然後啓動logstash服務:

nohup /usr/local/logstash/bin/logstash -f /usr/local/logstash/config/zabbix_output.conf &

4.2、zabbix平臺配置日誌告警
登錄zabbix web平臺,選擇配置—>模板—>創建模板,名稱定爲logstash-output-zabbix,如下圖所示:
在這裏插入圖片描述
在這裏插入圖片描述
創建應用集
點擊應用集—–>創建應用集
在這裏插入圖片描述
創建監控項(itme)
點擊監控項—–>創建監控項
在這裏插入圖片描述
到此爲止,zabbix監控logstash的日誌數據配置完成。
下面我們模擬一個故障,在任意主機通過ssh登錄192.168.2.15主機,然後輸入一個錯誤密碼,讓系統的/var/log/secure文件產生錯誤日誌,然後看看logstash是否能夠過濾到,是否能夠發送到zabbix中。

ssh [email protected]
cat /var/log/secure
#內容
Apr 23 11:24:12 wzb sshd[49569]: Failed password for root from 192.168.2.3 port 42978 ssh2

這裏面有我們要過濾的關鍵字Failed,因此logstash會將此內容過濾出來,發送到zabbix上。
接着,登錄zabbix web平臺,點擊監測中—–>最新數據,如果zabbix能夠接收到日誌,就可以看到下圖的最新數據:
在這裏插入圖片描述
點擊歷史記錄,可以查看詳細內容,如下圖所示:
在這裏插入圖片描述
可以看到,紅框中的內容就是在logstash中定義的message_content字段的內容。
zaibbix的itme類型及應用場景:
zabbix agent
zabbix自帶的客戶端程序(被動模式),zabbix server主動向它收集監控數據。agent提供豐富的key,包括不限於cpu、內存、網絡、磁盤、web等等。如果你不介意或者系統支持安裝此程序,那麼他是首選的。需要注意的是,server檢索數據有超時限制,最大超時時間30秒,如果檢索數據經常超過30秒,那麼,不建議你使用主動模式的agent,可以使用如下類型agent active

zabbix agent(active)
也需要安裝agent(主動模式),和上一個相同。但是數據由zabbix agent主動提交至zabbix server

simple check
基本的檢測,可以檢測網絡、端口、fping這些,功能很少並且無需安裝客戶端。

snmp check
snmp v1 check、snmp v2 check、snmp v3 check的功能都是一樣的。推薦如下場景:

客戶基於安全考慮,不同意安裝agent
路由器、打印機等等設備無法安裝,但是支持snmp協議
不喜歡頻繁對agent升級
zabbix internal
zabbix系統內部用,比如趨勢數據記錄數了、歷史記錄數量等等,日常業務監控用不上他。

zabbix trapper
也需要安裝agent(主動模式),你需要藉助bin/zabbix_sender將數據提交至zabbix server。如下情況適合使用:

檢索數據時間較長
同一時間有大量的數據要提交,例如redis info信息,裏面包含五六十項數據,通過zabbix_sender來一次性提交,顯然比agent來取幾十次要方便。
zabbix aggretage
aggregate checks是一個聚合的檢測,例如我想知道某個組的host負載平均值,硬盤剩餘總量,或者某幾臺機器的這些數據,簡單的說,這個方法就是用來了解一個整體水平,而不需要我們一臺臺看過去。這個方法的數據全部來之數據庫,所以它不需要agent。

external check
zabbix server運行腳本或者二進制文件來執行外部檢測,外部檢測不需要在被監控端運行任何agentd。

備註:請不要過度使用外部檢測,這會嚴重降低zabbix系統性能

database monitor
zabbix通過調用ODBC來獲取數據庫的數據以及數據庫狀態等等信息

IPMI agent
用於監控硬件設備,例如Dell或者hp服務器的主板溫度、cpu電壓、蓋子是不是被打開等等

SSH agent
zabbix使用提供的ssh信息(服務器用戶密碼或者證書)登錄服務器,執行指定的腳本來檢索數據。如下人適合用

不會安裝agent、不想相撞agent
不擔心賬號密碼/證書放在zabbix裏
Telnet agent
同上,Windows不支持ssh,可以使用Telnet agent。

jmx agent
通過jmx監控java jvm,比如tomcat。目前有一個很大的不足,如果tomcat多實例,jmx agent只能監控一個。如果是多實例,建議使用agent + cmdline-jmxclient-0.10.3.jar

zabbix Calculated
計算類型,在幾個key值之間做計算,例如redis自帶的info命令可以監控keyspace_hits和keyspace_misses這兩個值,但是redis的命中率不能直接獲取,可以通過zabbix的calculated實現監控redis的命中率

調試grok:http://grokdebug.herokuapp.com/
幫助文檔:http://www.ttlsa.com/zabbix/how-to-chose-zabbix-item-type/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章