在微服務開發過程當中,通常都會利用多臺服務器作分佈式部署,如何可以把分散在各個服務器中的日誌歸集起來作分析處理,是一個微服務服務須要考慮的一個因素。html
搭建一個日誌系統須要考慮一下一些因素:java
第一個問題,針對咱們小公司來講,基本沒有本身的研發能力,絕對是選用第三方開源的組件了。ELK配置比較簡單,有現成的UI界面,容易檢索日誌信息,是首選。
第二個問題,利用log4j2定義好統一的日誌格式,利用logstash過濾日誌內容。
第三個問題,全局跟蹤的ID有幾種生產方式,一種是利用UUID或者生成隨機數,一種是利用數據庫來生成sequence number,還能夠經過自定義一個id生成服務來獲取。考慮到自身服務的須要,這裏選用生成隨機數來實現。linux
從左邊看起,每一臺webserver上都會部署一個logstash-agent,它的做用是用相似tailf的方式監聽日誌文件,而後把新添加的日誌發送到redis隊列裏面,logstash-indexer負責從redis相應的隊列裏面取出日誌,對日誌進進行加工後輸出到elasticsearch中,elasticsearch會根據要求對日誌進行索引歸集,最後用戶能夠經過kibana來查看和分析日誌。git
準備工做github
這裏不涉及怎樣安裝JDK和Redis,請自行查閱資料web
使用logstash2.3.1, elasticsearch2.3.1, kibana2.3.1redis
首先去ELK官網下載相應的壓縮包
https://www.elastic.co/downloads數據庫
1.解壓 tar -zxvf logstash2.3.1
2.檢驗安裝是否成功 bin/logstash -e "input{stdin{}}output{stdout{}}"
,而後在終端輸入hello,看看有沒有內容返回
3.編寫配置文件logstash_agent.conf
在logstash安裝目錄下新建conf文件夾,在裏面新建配置文件logstash_agent.conf
服務器
input { file { type => "customer_service" #須要收集的日誌文件 path => ["/home/java/logs/cust/customer-service-*.log"] tags => ["customer-service", "log4j2"] # codec => multiline { # pattern => "^%{TIMESTAMP_ISO8601}" negate => true what => "previous" } } } output { redis { host => "192.168.235.195" data_type => "list" key => "logstash:redis:customer" } }
4.後臺啓動 nohup ./bin/logstash -f conf/logstash_agent.conf &
架構
1.解壓tar -zxvf elasticsearch-2.3.1.tar.gz
2.修改安裝目錄下的配置文件config/elasticsearch.yml
把network.host字段給反註釋掉,把地址改成0.0.0.0(官方並沒明確說要去改這配置,默認配置應該就能夠了,不過實測的時候發現若是不作這修改,elasticsearch訪問不了)
3.後臺啓動elasticsearch nohup ./bin/elasticsearch &
與在webserver上安裝logstash-agent
一節基本相同,只是配置文件不同,這裏使用logstash-indexer.conf
input { redis { host => "localhost" #redis地址 data_type => "list" key => "logstash:redis:customer" type => "redis-input" } } filter { grok { match => { "message" => "%{TIMESTAMP_ISO8601:date} \[(?<thread_name>.+?)\] (?<log_level>\w+)\s*(?<content>.*)" } } date { match => ["timestamp", "dd/MMM/YYYY:HH:mm:ss Z"] } } output { if[type] == "customer_service" { elasticsearch { #embedded => false #protocol => "http" hosts => "localhost:9200" index => "customer-%{+YYYY.MM.dd}" } }else if[type] == "其餘類型" { elasticsearch { #embedded => false #protocol => "http" hosts => "localhost:9200" index => "其餘類型索引名字-%{+YYYY.MM.dd}" } }else { //作其餘處理 } stdout{ #輸出到標準輸出,能夠去掉 } }
啓動logstash-indexer
nohup ./bin/logstash -f conf/logstash-indexer.conf &
1.解壓tar -zxvf kibana-4.5.0-linux-x64.gz
2.後臺啓動kibana nohup ./bin/kibana &
這裏沒有特別去配置kibana要訪問的elasticsearch地址,默認它會找本地的,若是須要,能夠到conf/kibana.yml修改
<PatternLayout pattern="%d{ISO8601} %t %level %msg%n"/>
1.打開kibana主頁http://your-kibana-ip:5601/
2.輸入索引customer-*
,並點擊create
3.在Discover頁面觀察日誌
須要瞭解elasticsearch日誌存放在哪裏,按期清理日誌
索引放久了須要清理,清理因此可使用Elasticsearch的API。
例如我須要刪除某個索引2016年5月份的全部索引,可使用下面的命令:
curl -XDELETE 'http://localhost:9200/customer-2016.05.*'
更多API能夠查閱Elastic官網
https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete.html
http://www.cnblogs.com/yjf512/p/4199105.html
http://www.cnblogs.com/xing901022/p/4805586.html
https://github.com/chenryn/logstash-best-practice-cn/blob/master/codec/multiline.md
http://www.open-open.com/lib/view/open1451801542042.html
轉自
用ELK搭建簡單的日誌收集分析系統http://m.blog.csdn.net/lzw_2006/article/details/51280058