針對公司項目微服務化,隨着項目及服務器的不斷增多,決定採用ELK(Elasticsearch+Logstash+Kibana)日誌分析平臺進行微服務日誌分析。
1.ELK整體方案
1.1 ELK架構圖
1.2 ELK工作流程
1.在微服務服務器上部署Logstash,作爲Shipper的角色,對微服務日誌文件數據進行數據採集,將採集到的數據輸出到Redis消息隊列。
2.在另外一臺服務器上部署Logstash,作爲Indexer的角色,從Redis消息隊列中讀取數據(可以對數據進行處理),輸出到Elasticsearch-Master主節點。
3.Elasticsearch-Master主節點內部與副節點同步數據。(Elasticsearch集羣建議3個服務以上奇數)
4.Kibana部署一臺服務器內,讀取Elasticsearch集羣數據,展示Web查詢頁面,提供數據展示。
2.消息隊列選型
2.1 Redis
在我這個最終方案中,選擇了使用Redis作爲消息隊列進行緩衝,降低Elasticsearch壓力,起到削峯作用,主要原因還是由於公司考慮成本問題,日誌收集也是隻針對我們單個項目組來使用,所以選擇了公司現在就已經有的Redis集羣進行復用。
2.2 Kafka
最初方案中,在消息隊列上選擇的是Kafka,畢竟Kafka天生就是做爲消息隊列的,具體二者的畢竟在這裏我就不多說了,百度上一大堆。
3.安裝
這裏就不在這裏寫出來了,提供三個地址僅供參考:
Linux安裝Logstash Linux安裝Kibana Linux安裝Elasticsearch
4.Logstash配置
4.1 log2redis
從日誌文件讀取到redis
#從日誌文件讀取數據 #file{} #type 日誌類型 #path 日誌位置 # 可以直接讀取文件(a.log) # 可以所有後綴爲log的日誌(*.log) # 讀取文件夾下所有文件(路徑) #start_position 文件讀取開始位置 (beginning) #sincedb_path 從什麼位置讀取(設置爲/dev/null自動從開始位置讀取) input { file { type => "log" path => ["/root/logs/info.log"] start_position => "beginning" sincedb_path => "/dev/null" } } #根據時間戳分隔日誌 #grok 區分日誌中得字段 filter { multiline { pattern => "^%{TIMESTAMP_ISO8601} " negate => true what => previous } #定義數據的格式 grok { match => { "message" => "%{DATA:datetime} - %{DATA:logLevel} - %{DATA:serviceName} - %{DATA:ip} - %{DATA:pid} - %{DATA:thread} - %{DATA-msg}"} } } #輸出數據到Redis #host Redis主機地址 #port Redis端口 #db Redis數據庫編號 #data_type Redis數據類型 #key Redis的key #password Redis密碼 output { redis { host => "ip" port => "6379" db => "6" data_type => "list" password => "password" key => "test_log" } }
4.2 redis2es
從redis讀取到es
#從redis內讀取數據 #host Redis主機ip #port Redis端口 #data_type Redis數據類型 #batch_count #password Redis密碼 #key Redis讀取Key input { redis { host => "ip" port => "6379" db => "6" data_type => "list" password => "password" key => "test_log" } } #數據的輸出我們指向了es集羣 #hosts Elasticsearch主機地址 #index Elasticsearch索引名稱 output { elasticsearch { hosts => "ip:9200" index => "logs-%{+YYYY.MM.dd}" } }
5 其他
其他剩下的就是Es集羣和Kibana了,這兩個沒什麼特別值得注意的地方,上網隨便搜,一大堆文章。
以上僅僅代表本人項目使用方案,不一定完美適合所有場景,僅供參考。