Logstash:日志分析整合利器
譯文【2013年9月5日 51CTO外電頭條】要是系統(tǒng)上哪里出現(xiàn)了什么岔子,日志文件是尋找線索以便排除故障的頭一個(gè)地方。Logstash是內(nèi)置有分析工具的日志服務(wù),它可以整合來(lái)自許多服務(wù)器的日志,甚至讓這些數(shù)據(jù)易于搜索。
要是企業(yè)網(wǎng)絡(luò)上任何環(huán)節(jié)出現(xiàn)了什么岔子,管理員就得馬上找出問(wèn)題,并解決問(wèn)題。找到出錯(cuò)信息通常不是問(wèn)題,畢竟大多數(shù)IT系統(tǒng)給出了源源不斷的系統(tǒng)日志條目和出錯(cuò)消息,但要在包括眾多設(shè)備、系統(tǒng)和服務(wù)器的復(fù)雜網(wǎng)絡(luò)中正確地評(píng)估這些信息,卻常常是說(shuō)起來(lái)容易做起來(lái)難。
一個(gè)問(wèn)題是生成的大量信息。一方面,諸如Pacemaker集群管理器這些工具特別啰嗦,顯示的信息要比實(shí)際需要的信息多好多倍。另一方面,就Apache而言,要是管理員對(duì)它進(jìn)行了設(shè)置,分開(kāi)記錄每個(gè)虛擬主機(jī)的日志,數(shù)據(jù)最后有可能跑到好多個(gè)地方。在為許多客戶提供服務(wù)的Web服務(wù)器上,大量的日志文件會(huì)日積月累,這就意味著為某個(gè)用戶排除具體問(wèn)題可能是一項(xiàng)沒(méi)完沒(méi)了的任務(wù)。
依賴(lài)OpenStack、CloudStack或其他云平臺(tái)的云計(jì)算環(huán)境擁有的服務(wù)器很少是少于20臺(tái)的,服務(wù)器日志的數(shù)量會(huì)激增,與服務(wù)器系統(tǒng)的數(shù)量成正比。
通常采用的解決辦法就是,在中央系統(tǒng)上由日志服務(wù)器收集日志,而不是任由日志散布于整個(gè)網(wǎng)絡(luò)上。這個(gè)做法可以幫助你通過(guò)SSH在多臺(tái)服務(wù)器之間瀏覽查找時(shí),無(wú)需過(guò)于頻繁地敲鍵。有些日志文件甚至為日志編制索引,以便搜索起來(lái)既快速又方便。像Splunk這些商用工具就提供了這種增值類(lèi)型的日志服務(wù)。
面對(duì)這些商用日志工具,開(kāi)源社區(qū)祭出的利器就是Logstash,這項(xiàng)中央日志服務(wù)提供了一種選擇,可以通過(guò)Web界面來(lái)搜索現(xiàn)有的日志條目。
Logstash及其助手
嚴(yán)格來(lái)說(shuō),光憑Logstash無(wú)力確保對(duì)日志文件實(shí)行合理化、集中式的管理。執(zhí)行任務(wù)時(shí)想取得預(yù)期的效果,Logstash就需要得到一些幫助。Logstash本身是個(gè)Java應(yīng)用程序,盡管好多管理員對(duì)Java懷有種種偏見(jiàn)——無(wú)論這些偏見(jiàn)有沒(méi)有道理,Logstash開(kāi)發(fā)人員決定支持Java有其充分的事實(shí)根據(jù)。因?yàn)镴ava還安裝在Windows上——這是理所當(dāng)然的事,Logstash可以在日志文件庫(kù)里面加入Windows日志文件;在許多情況下,換成其他的Rsyslog服務(wù),就很難做到這一點(diǎn)。
Logstash的安裝牽涉不止一臺(tái)服務(wù)器,它由至少五個(gè)不同的服務(wù)組成。核心角色由Logstash的自有組件shipper來(lái)扮演:shipper基本上是在每個(gè)目標(biāo)系統(tǒng)上運(yùn)行的客戶端,負(fù)責(zé)收集日志消息。下一步,shipper把日志消息發(fā)送給indexer,該組件負(fù)責(zé)按管理員指定的方式,解讀和處理日志信息。indexer所在的主機(jī)通常還運(yùn)行Logstash Web服務(wù)器,這為管理員提供了查找日志文件的搜索框。在后臺(tái),并不直接屬于Logstash,但對(duì)其功能而言很重要的另外兩個(gè)服務(wù)負(fù)責(zé)各自的任務(wù),它們是Redis消息代理和ElasticSearch存儲(chǔ)及搜索環(huán)境。
Redis為shipper與indexer之間的通信起到了關(guān)鍵作用。每臺(tái)服務(wù)器上的Logstash實(shí)例將其消息傳送到Redis服務(wù)器;在該服務(wù)器上,Logstash indexer在下一步中檢索這些消息。ElasticSearch也是個(gè)Java應(yīng)用程序,它在后臺(tái)編制索引,并提供界面,以便Logstash Web服務(wù)器將來(lái)自Web界面的搜索請(qǐng)求轉(zhuǎn)發(fā)至該界面。
模塊化設(shè)計(jì)
Logstash的一大優(yōu)點(diǎn)在于其多樣性,這源自其模塊化設(shè)計(jì),因而讓這個(gè)工具顯得非常靈活:比如說(shuō)就在幾個(gè)月前,安裝的Logstash使用AMQP代理來(lái)取代Redis還很常見(jiàn)——RabbitMQ是通常的選擇。
不過(guò),Logstash的amqp模塊沒(méi)有得到非常好的維護(hù),也不是特別受Logstash開(kāi)發(fā)者的歡迎。很容易實(shí)現(xiàn)改用另一種不同代理的決定,那是由于只需要為消息代理編寫(xiě)接口。與此同時(shí),Redis連接器可以順暢地工作,RabbitMQ遂成了明日黃花。
沒(méi)有限制
在其他地方,Logstash對(duì)管理員的創(chuàng)造力幾乎沒(méi)有什么限制:這款工具不僅提供了通過(guò)已定義過(guò)濾器存檔日志條目的功能,還提供了解讀日志條目的功能,因?yàn)槊恳粋€(gè)日志條件都編入索引、易于搜索。
比如說(shuō),一接到請(qǐng)求,Logstash會(huì)管理HTTP日志,以后可以在Web界面中進(jìn)行有條理的搜索,查找已引起“內(nèi)部錯(cuò)誤”的所有可能的查詢(xún)。比如說(shuō),如果應(yīng)用到Pacemaker,這意味著管理員可以明確搜索帶ERROR前綴的Pacemaker日志消息。
還可以設(shè)計(jì)過(guò)濾器,完全去除日志記錄中的各個(gè)條目。比如說(shuō),如果你想讓典型的系統(tǒng)日志MARK消息不出現(xiàn)在日志存檔中,只要改動(dòng)Logstash shipper配置。
測(cè)試安裝
如果你想試一試Logstash,那么你很走運(yùn)。與網(wǎng)站上的描述恰恰相反,安裝工作絕不是什么極為艱巨的任務(wù)。只要確保事先明確你將哪個(gè)角色分配給了哪個(gè)主機(jī)。一旦明確了Redis服務(wù)器、ElasticSearch和 Logstash indexer將運(yùn)行哪個(gè)主機(jī),你就可以準(zhǔn)備上路了。下面這個(gè)例子基于Ubuntu 12.04,但也適用于Debian。網(wǎng)上也有面向典型企業(yè)發(fā)行版的Redis和ElasticSearch的RPM程序包,包括紅帽企業(yè)級(jí)Linux(RHEL)和SUSE Linux企業(yè)級(jí)服務(wù)器(SLES)等發(fā)行版。
安裝Redis有多容易,這在很大程度上取決于有沒(méi)有適用你系統(tǒng)的Redis服務(wù)器程序包。在Ubuntu上,一個(gè)簡(jiǎn)單的命令:
- apt-get install redis-server
即可安裝相關(guān)組件。之后,建議修改/etc/redis/redis.conf中的127.0.0.1 bind條目,那樣它含有該主機(jī)的IP地址。要不然,Redis只連接到本地主機(jī),這會(huì)阻止其他主機(jī)將各自的Logstash消息直接發(fā)送到Redis。重視安全的那些管理員應(yīng)該通過(guò)redis.conf里面的requirepass指令,設(shè)定一個(gè)訪問(wèn)密碼。
安裝ElasticSearch
ElasticSearch(見(jiàn)圖1)是個(gè)類(lèi)似Logstash的Java應(yīng)用程序;遺憾的是,Ubuntu里面沒(méi)有任何程序包。
圖1:日志消息的組織和管理工作不是由Logstash來(lái)處理,而由在后臺(tái)運(yùn)行的ElasticSearch來(lái)處理。
幸好,可以從Upstream得到幫助,Upstream在其網(wǎng)站上為Ubuntu提供了預(yù)制的.deb程序包;它也可以通過(guò)dpkg –i來(lái)安裝。由于未遇到依賴(lài)項(xiàng),該命令起初返回了出錯(cuò)消息。執(zhí)行了apt-get -f install命令后,ElasticSearch已準(zhǔn)備就緒。
默認(rèn)情況下,ElasticSearch還可以對(duì)127.0.0.1進(jìn)行監(jiān)聽(tīng),所以indexer必須在同一個(gè)主機(jī)上運(yùn)行。如果你想讓ElasticSearch和Logstash索引服務(wù)在不同的主機(jī)上運(yùn)行,就要在/etc/elasticsearch/elasticsearch.yml中找到必要的參數(shù)選項(xiàng)符;它們帶有network.bind_host和network.host名稱(chēng)。
發(fā)送
下一步,你必須配置Logstash本身。Logstash并不以面向客戶端和服務(wù)器的單個(gè)Java庫(kù)這個(gè)方式出現(xiàn),而是以涵蓋所有服務(wù)的一個(gè)大文件這個(gè)方式出現(xiàn),這很重要。下載了Logstash JAR文件(截至截稿為止,最新版本是1.1.9)后,你只要選擇合適的參數(shù)就行了。
對(duì)shipper而言,你的shipper.conf file應(yīng)該像是代碼片段1中的那樣。
代碼片段1:shipper.conf
- input{
- file{
- type=>"syslog"
- # 通配符在此適用:)
- path=>["/var/log/messages","/var/log/
- syslog","/var/log/*.log"]
- }
- file{
- type=>"apache-access"
- path=>"/var/log/apache2/access.log"
- }
- file{
- type=>"apache-error"
- path=>"/var/log/apache2/error.log"
- }
- }
- output{
- stdout{debug=>truedebug_format=>"json"}
- redis{host=>"192.168.122.165"data_type=>
- "list"key=>"logstash"}
- }
有了這種配置,Logstash會(huì)將來(lái)自系統(tǒng)日志文件和Apache的消息發(fā)送給“默認(rèn)”虛擬域中的indexer。該示例中帶indexer的主機(jī)是192.168.122.165。
第22行中的key可能讓人覺(jué)得有點(diǎn)困惑;它不是指為驗(yàn)證身份而設(shè)置的密鑰,而是指Redis所用的、作為L(zhǎng)ogstash隊(duì)列名稱(chēng)的值。有了這個(gè)配置文件,
- java -jar logstash-1.1.9-monolithic.jar agent -f shipper.conf
命令會(huì)啟動(dòng)Logstash。
索引
如果你從合適的配置開(kāi)始入手,設(shè)置indexer也不復(fù)雜(代碼片段2)。
代碼片段2:Indexer.conf
- input{
- redis{
- host=>"192.168.122.165"
- type=>"redis-input"
- data_type=>"list"
- key=>"logstash"
- format=>"json_event"
- }
- }
- output{
- elasticsearch{
- host=>"192.168.122.165"
- }
- }
Logstash配置因而分成了輸入塊和輸出塊——顧名思義,這兩個(gè)塊指明了某項(xiàng)服務(wù)如何得到消息、該服務(wù)在何處轉(zhuǎn)發(fā)消息。
indexer用這個(gè)命令開(kāi)始其日常工作:
- java -jar logstash-1.1.9-monolithic.jar agent -f indexer.conf
較之shipper,indexer在標(biāo)準(zhǔn)輸出通道中幾乎不生成自己的任何輸出,所以要是一切很平靜,你用不著擔(dān)心。
服務(wù)
最后,你需要Logstash Web服務(wù)器本身;它不需要自己的配置文件,可以用這個(gè)命令來(lái)開(kāi)啟:
- java -jar logstash-1.1.9-monolithic.jar web --backend elasticsearch://192.168.122.165/
該命令運(yùn)行后,你應(yīng)該能夠通過(guò)端口9292,立即登錄到Logstash系統(tǒng)(見(jiàn)圖2)。在這個(gè)例子中,完整的地址應(yīng)該是:http://192.168.122.165:9292。
圖2:在Logstash記錄里面搜索“Network Manager”會(huì)顯示按時(shí)間排序的消息。
在首次啟動(dòng)后,日志消息應(yīng)該會(huì)立即開(kāi)始出現(xiàn)(見(jiàn)圖3);此外,你可以通過(guò)搜索框來(lái)核實(shí)這個(gè)過(guò)程。這基本上算是Logstash安裝過(guò)程的最后一個(gè)主要步驟。
圖3:Logstash shipper的狀態(tài)更新表明了軟件在如何運(yùn)行:它將收到的日志消息發(fā)送給Redis。
系統(tǒng)操作人員可以隨意修改設(shè)置,以符合各自的需要。比如說(shuō),你通常希望啟動(dòng)時(shí)在所有系統(tǒng)上運(yùn)行Logstash shipper,這意味著只要編寫(xiě)一個(gè)匹配的init腳本(如果你想避免自編腳本,可以在網(wǎng)上找到這方面的預(yù)定義腳本。)
還建議創(chuàng)建針對(duì)特定應(yīng)用的過(guò)濾器,以便充分利用該解決方案的所有選項(xiàng)。供應(yīng)商網(wǎng)站上概述了各種可能的Logstash過(guò)濾器選項(xiàng)(https://github.com/logstash/grok-patterns),它們也支持正則表達(dá)式,網(wǎng)站還有內(nèi)容全面的說(shuō)明文檔。
結(jié)論
Logstash是一種非常精巧的中央日志解決方案。已經(jīng)有Chef菜譜(Chef cookbook)和Puppet配方(Puppet recipe),這對(duì)平時(shí)維護(hù)龐大計(jì)算機(jī)集群,需要進(jìn)行集中式配置文件管理的管理員來(lái)說(shuō)特別有用。Logstash在這類(lèi)環(huán)境下可以很容易地改動(dòng)。不過(guò),搜索日志時(shí),Logstash確實(shí)可以大顯身手。曾手動(dòng)搜索成千上萬(wàn)行日志條目的管理員會(huì)發(fā)現(xiàn),借助Logstash排除故障確實(shí)讓人眼前一亮。只有對(duì)Java明顯不感冒的管理員才無(wú)法認(rèn)識(shí)到其真正的價(jià)值。
原文鏈接:http://www.linuxpromagazine.com/Online/Features/Consolidating-Logs-with-Logstash