线上日志集中化可视化管理: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三個開源工具組成。官方網站: ? 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.0mkdir 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 socketlog4j.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_64root@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+款云產品!?
更多網易研發、產品、運營經驗分享請訪問網易云社區。
相關文章:
【推薦】?知物由學 | 你真的了解網絡安全嗎?
【推薦】?試水新的Angular4HTTPAPI
轉載于:https://www.cnblogs.com/163yun/p/9722657.html
總結
以上是生活随笔為你收集整理的线上日志集中化可视化管理:ELK的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Shell数组操作(添加、删除元素、清空
- 下一篇: [bzoj3489]A simple r