線上日誌集中化視覺化管理:ELK
本文來自網易雲社群
作者:王貝
為什麼推薦ELK:
當線上伺服器出了問題,我們要做的最重要的事情是什麼?當需要實時監控跟蹤伺服器的健康情況,我們又要拿什麼去分析?大家一定會說,去看日誌,去分析日誌。是的,日誌對於伺服器開發人員來講是最親密的夥伴了,基本上每天都會去看各種型別的海量的日誌去定位問題,去做統計分析等等。最常見的檢視日誌的情況,比如線上出了bug,我們ssh到線上伺服器,cd到伺服器的日誌目錄,然後less一下當天的日誌檔案,執行shift+G,?error,n,一系列操作之後找到對應的異常情況,查出異常原因。可是,這樣好low啊,效率好低啊,為什麼呢?首先,我們要登入到伺服器,線上基本上都是伺服器叢集,少則十幾臺,多則上百臺,光這一臺一臺的伺服器去登入就是一個巨大而又繁瑣的工作,其次,我們有時還要各種聚合(比如對比多臺機器同一時間點的日誌),或者基於異常多個關鍵詞的搜尋,並有且,或,交,並,差,補,排序等一些操作,而且相應速度必須給力,那這個時候無論怎麼grep awk估計都無濟於事了。面對服務叢集,面對海量日誌,沒有一個集中化視覺化的日誌管理,程式猿GG估計真的要跪了。為了解放眾多webserver程式猿,為了解放生產力提高效率,為了更精準實時的檢視分析線上日誌,業界放了一個大招:用強強聯手的ELK日誌分析平臺實現集中化視覺化日誌管理。如果線上環境出了故障,能夠立刻準確定位,ELK就是高手,在百萬大軍中取上將首級,猶如探囊取物,所以這時候ELK就非常適合了,當然除此之外,ELK也經常在運維工作中大放光彩,在應用級別的實時監控,非常適合一些重要核心服務的預警。
先簡單上兩個例子顯示一下ELK的強大:
(1)根據過濾規則,生成24小時內所有伺服器的ERROR比例餅狀圖,監控伺服器的健康程度。(目前GACHA專案7臺server接入了ELK平臺正在試用,這張圖是這七臺server過去24小時的異常比例)
(2)生成24小時內每個時間範圍內的異常數量柱狀圖,點選柱狀圖下面可以看到具體異常堆疊情況(柱狀圖統計的是GACHA專案伺服器叢集過去24小時每個時間段的異常數量,柱狀圖下面是異常列表,第一張圖左側可以選擇新增異常列表展示項,第二張圖就是選擇了展示host,priority,stack trace,message這些項的結果,第三張圖是點選可以看到的具體異常堆疊詳情)。
好了,看到這些,是不是心略有所動呢,其實ELK的強大還遠不止於此呢,打個雞血繼續往下看吧。
ELK簡介:
ELK由ElasticSearch、Logstash和Kiabana三個開源工具組成。官方網站: ofollow,noindex" target="_blank"> https://www.elastic.co/products
(1)Elasticsearch是個開源分散式搜尋引擎,它的特點有:分散式,零配置,自動發現,索引自動分片,索引副本機制,restful風格介面,多資料來源,自動搜尋負載等。
(2)Logstash是一個完全開源的工具,他可以對你的日誌進行收集、過濾,並將其儲存供以後使用(如,搜尋)。
(3)Kibana 也是一個開源和免費的工具,它Kibana可以為 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 介面,可以幫助您彙總、分析和搜尋重要資料日誌。
由此可以看到,ELK組合其實可以看成一個MVC模型,logstash接收應用伺服器的日誌傳輸請求收集日誌,相當於控制層controller,ElasticSearch用於資料來源儲存,搜尋等,相當於Model,而Kibana提供友好的 Web 介面,相當於View。
ELK 搭建:
接下來,我走一下ELK整個搭建流程:
第一步:搭建ElasticSearch
(1)首先下載ElasticSearch(先安裝jdk1.7,整個就不細說了),這裡我用的是Elasticsearch 2.4.1版本:
wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.4.1/elasticsearch-2.4.1.tar.gz
(2)解壓:
tar -zxvf elasticsearch-2.4.1.tar.gz
(3)配置:
cd elasticsearch-2.4.1
vim config/elasticsearch.yml
#ES的叢集名稱
cluster.name : es_cluster
#當前該節點名
node.name : node0
#當前節點是否允許被選舉為master節點
#node.master: true
#當前節點是否允許儲存資料
node.data: true
#索引分片個數
index.number_of_shards: 5
#索引副本個數
index.number_of_replicas: 1
#索引資料儲存路徑,
path.data : /home/hzwangbei/elasticsearch/data
path.logs : /tmp/elasticsearch/logs
#讀取配置檔案路徑,預設ES根目錄config路徑
#path.conf: /path/to/conf
#ES外掛儲存路徑,預設ES根目錄plugins路徑
#path.plugins: /path/to/plugins
#當前hostname或IP,這是ES用來監聽的,網易雲主機最好配置0.0.0.0,這樣私有ip和機房ip都可以監聽到。
network.bind_host: 0.0.0.0
#設定其它節點和該節點互動的ip地址。網易雲主機這裡配置機房ip
#network.publish_host:0.0.0.0
network.port : 9200
#indexcache過期時間
#index.cache.field.expire:100m
#預設型別為resident, 字面意思是常駐(居民), 一直增加,直到記憶體 耗盡。 改為soft就是當記憶體不足的時候,先clear掉 佔用的,然後再往記憶體中放。設定為soft後,相當於設定成了相對的記憶體大小。resident的話,除非記憶體夠大。
index.cache.field.type: soft
#預設是3s,這是設定叢集中自動發現其它節點時ping連線超時時間。
discovery.zen.ping.timeout: 40s #設定是否開啟多播發現節點,預設是true。 #discovery.zen.ping.multicast.enabled: false
#指明叢集中其它可能為master的節點ip,以防es啟動後發現不了叢集中的其他節點。
#discovery.zen.ping.unicast.hosts:["節點1的 ip","節點2 的ip","節點3的ip"]
(4)外掛安裝
安裝head外掛:
./bin/plugin install mobz/elasticsearch-head
(5)啟動ES
./bin/elasticsearch
不幸的是報錯了,後來在一個國外的論壇上看到ES啟動時的使用者和組不能和當前目錄所屬使用者和組一致,我比較了一下,果然,我以root使用者啟動ES,而當前目錄所屬使用者正好是root,找到原因了,那就換個使用者啟動吧。
可以看到,ES成功啟動,好,到此,我們成功邁的向ELK邁出了一步。
開啟連結: http://localhost:9200/_plugin/head/
可以看到node0這個節點中有兩個索引(前提條件已經新建索引且有資料了):applog .kibana,然後點選資料瀏覽,選中applog索引,可以看到applog索引下儲存的日誌。
好了,到此為止,你一定在想,這些資料從哪裡來的吧,文章前面講過,ES是一個model層,那麼資料當然就是從controller層即logstash收集過來的。lets開始我們的第二步,搭建logstash。
第二步:安裝logstash
logstash功能模組圖
其實它就是一個收集器而已,我們需要為它指定Input和Output(當然Input和Output可以為多個)。由於我們需要把Java程式碼中Log4j的日誌輸出到ElasticSearch中,因此這裡的Input就是Log4j,而Output就是ElasticSearch。
(1)下載logstash
wget https://download.elastic.co/logstash/logstash/logstash-2.4.0.tar.gz
(2)解壓
tar -zxvf logstash-2.4.0.tar.gz
(3)根目錄下建立config資料夾,然後建立log4j_to_es.conf檔案
cd logstash-2.4.0 mkdir config vim log4j_to_es.conf input { log4j { mode => "server" host => "localhost" //網易雲主機機房ip port => 4567 } } filter { #Only matched data are send to output. } output { elasticsearch { action => "index" #The operation on ES hosts => "localhost:9200" #ElasticSearch host, can be array. index => "applog" #The index to write data to. } }
(4)啟動logstash
./bin/logstash agent -f config/log4j_to_es.conf
到此,logstash安裝成功,logstash是一個收集器,剛剛我們在配置檔案裡配置了log4j的收集配置,所以,在我們的專案裡,把log4j的配置加一個socket appender就可以了
# appender socket log4j.rootLogger=${log4j.level}, stdout,socket log4j.appender.socket=org.apache.log4j.net.SocketAppender log4j.appender.socket.Port=4567 #log4j.appender.socket.Threshold=ERROR log4j.appender.socket.RemoteHost=localhost log4j.appender.socket.layout=org.apache.log4j.PatternLayout log4j.appender.socket.layout.ConversionPattern=%d %-5p %c%x - %m%n log4j.appender.socket.ReconnectionDelay=10000
好了,到此,ES和logstash搭建完畢,基本上可以實現日誌的收集和儲存了。可是這還不夠,文章開頭,我們舉了餅狀圖和柱狀圖的兩個例子,那麼這兩種圖是怎麼生成的呢?那就看一下我們的view層kibana,開始我們的第三步:安裝kibana。
第三步:kibana安裝
(1)下載kibana
wget https://download.elastic.co/kibana/kibana/kibana-4.6.1-linux-x86_64.tar.gz
這裡要注意下,kibana的版本很多,下載的時候要參考ES的版本,由於我們的ES安裝的是2.4.1,所以我們這裡使用Kibana4.6.1,選擇kibana版本時一定要保證和ES版本的相容。
(2)解壓kibana
tar -zxvf kibana-4.6.1-linux-x86_64.tar.gz
(3)配置kibana
root@wangbei-ThinkPad-E560:/usr/local/elk# cd kibana-4.6.1-linux-x86_64 root@wangbei-ThinkPad-E560:/usr/local/elk/kibana-4.6.1-linux-x86_64# vim config/kibana.yml server.port: 5601 server.host: "localhost" elasticsearch.url: http://localhost:9200 kibana.index: ".kibana"
(4)啟動kibana
root@wangbei-ThinkPad-E560:/usr/local/elk/kibana-4.6.1-linux-x86_64# ./bin/kibana
好了,到此,大功告成,瀏覽器開啟: http://localhost:5601
為了後續使用Kibana,需要配置至少一個Index名字或者Pattern,它用於在分析時確定ES中的Index。這裡我輸入之前配置的Index名字applog,Kibana會自動載入該Index下doc的field,並自動選擇合適的field用於圖示中的時間欄位:
建立完索引之後,你就可以領略ELK的強大啦!
快捷的搜尋方式,強大好用的搜尋語法,牛叉的圖形繪製,簡直碉堡!
最主要的還是將日誌集中化管理,視覺化呈現,實時化監控!
還有以後再也不用苦逼的ssh less grep了,那些複雜的日誌分析也迎刃而解啦!
不得不感嘆,大好福利真的來啦!
注意:
ELK線上的使用還要注意ES的記憶體配置,網路設定等等因素。
網易雲 免費體驗館 ,0成本體驗20+款雲產品!
更多網易研發、產品、運營經驗分享請訪問 網易雲社群 。
相關文章:
【推薦】 淺析電商防止惡意下單
【推薦】 virtualenv簡介以及一個比較折騰的scrapy安裝方法
【推薦】 Android TV 開發(5)