ELK 已經(jīng)成為目前最流行的集中式日志解決方案,它主要是由Beats、Logstash、Elasticsearch、Kibana等組件組成,來共同完成實時日志的收集,存儲,展示等一站式的解決方案。本文將會介紹ELK常見的架構(gòu)以及相關(guān)問題解決。
這種架構(gòu)是比較原始的部署架構(gòu),在各應(yīng)用服務(wù)器端分別部署一個Logstash組件,作為日志收集器,然后將Logstash收集到的數(shù)據(jù)過濾、分析、格式化處理后發(fā)送至Elasticsearch存儲,最后使用Kibana進行可視化展示。
這種架構(gòu)不足的是:Logstash比較耗服務(wù)器資源,所以會增加應(yīng)用服務(wù)器端的負載壓力。
圖片
該架構(gòu)與第一種架構(gòu)唯一不同的是:應(yīng)用端日志收集器換成了Filebeat,F(xiàn)ilebeat輕量,占用服務(wù)器資源少,所以使用Filebeat作為應(yīng)用服務(wù)器端的日志收集器,一般Filebeat會配合Logstash一起使用,這種部署方式也是目前最常用的架構(gòu)。
圖片
該架構(gòu)在第二種架構(gòu)的基礎(chǔ)上引入了Kafka消息隊列(還可以是其他消息隊列),將Filebeat收集到的數(shù)據(jù)發(fā)送至Kafka,然后在通過Logstasth讀取Kafka中的數(shù)據(jù),這種架構(gòu)主要是解決大數(shù)據(jù)量下的日志收集方案,使用緩存隊列主要是解決數(shù)據(jù)安全與均衡Logstash與Elasticsearch負載壓力。
圖片
第一種部署架構(gòu)由于資源占用問題,現(xiàn)已很少使用,目前使用最多的是第二種部署架構(gòu),至于第三種部署架構(gòu)個人覺得沒有必要引入消息隊列,除非有其他需求,因為在數(shù)據(jù)量較大的情況下,F(xiàn)ilebeat 使用壓力敏感協(xié)議向 Logstash 或 Elasticsearch 發(fā)送數(shù)據(jù)。
如果 Logstash 正在繁忙地處理數(shù)據(jù),它會告知 Filebeat 減慢讀取速度。擁塞解決后,F(xiàn)ilebeat 將恢復(fù)初始速度并繼續(xù)發(fā)送數(shù)據(jù)。
系統(tǒng)應(yīng)用中的日志一般都是以特定格式進行打印的,屬于同一條日志的數(shù)據(jù)可能分多行進行打印,那么在使用ELK收集日志的時候就需要將屬于同一條日志的多行數(shù)據(jù)進行合并。
解決方案:使用Filebeat或Logstash中的multiline多行合并插件來實現(xiàn)
在使用multiline多行合并插件的時候需要注意,不同的ELK部署架構(gòu)可能multiline的使用方式也不同,如果是本文的第一種部署架構(gòu),那么multiline需要在Logstash中配置使用,如果是第二種部署架構(gòu),那么multiline需要在Filebeat中配置使用,無需再在Logstash中配置multiline。
1)multiline在Filebeat中的配置方式:
filebeat.prospectors: - paths: - /home/project/elk/logs/test.log input_type: log multiline: pattern: '^/[' negate: true match: afteroutput: logstash: hosts: ["localhost:5044"]
如:
pattern: '/['negate: truematch: after
該配置表示將不匹配pattern模式的行合并到上一行的末尾
2)multiline在Logstash中的配置方式
input { beats { port => 5044}}filter { multiline { pattern => "%{LOGLEVEL}/s*/]" negate => true what => "previous" }}output { elasticsearch { hosts => "localhost:9200" }}
(1)Logstash中配置的what屬性值為previous,相當于Filebeat中的after,Logstash中配置的what屬性值為next,相當于Filebeat中的before。
(2)pattern => "%{LOGLEVEL}/s*/]" 中的LOGLEVEL是Logstash預(yù)制的正則匹配模式,預(yù)制的還有好多常用的正則匹配模式,詳細請看:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns
默認情況下,我們在Kibana中查看的時間字段與日志信息中的時間不一致,因為默認的時間字段值是日志收集時的當前時間,所以需要將該字段的時間替換為日志信息中的時間。
解決方案:使用grok分詞插件與date時間格式化插件來實現(xiàn)
在Logstash的配置文件的過濾器中配置grok分詞插件與date時間格式化插件,如:
input { beats { port => 5044 }}filter { multiline { pattern => "%{LOGLEVEL}/s*/]/[%{YEAR}%{MONTHNUM}%{MONTHDAY}/s+%{TIME}/]" negate => true what => "previous"}grok { match => [ "message" , "(?<customer_time>%{YEAR}%{MONTHNUM}%{MONTHDAY}/s+%{TIME})" ]}date { match => ["customer_time", "yyyyMMdd HH:mm:ss,SSS"] //格式化時間 target => "@timestamp" //替換默認的時間字段 }}output { elasticsearch { hosts => "localhost:9200" }}
如要匹配的日志格式為:[DEBUG][20170811 10:07:31,359][DefaultBeanDefinitionDocumentReader:106] Loading bean definitions,解析出該日志的時間字段的方式有:
① 通過引入寫好的表達式文件,如表達式文件為customer_patterns,內(nèi)容為:CUSTOMER_TIME %{YEAR}%{MONTHNUM}%{MONTHDAY}/s+%{TIME}
注:內(nèi)容格式為:[自定義表達式名稱] [正則表達式]
然后logstash中就可以這樣引用:
filter { grok { patterns_dir => ["./customer-patterms/mypatterns"] //引用表達式文件路徑 match => [ "message" , "%{CUSTOMER_TIME:customer_time}" ] //使用自定義的grok表達式 }}
② 以配置項的方式,規(guī)則為:(?<自定義表達式名稱>正則匹配規(guī)則),如:
filter { grok { match => [ "message" , "(?<customer_time>%{YEAR}%{MONTHNUM}%{MONTHDAY}/s+%{TIME})" ] }}
一般在Kibana中顯示的日志數(shù)據(jù)混合了來自不同系統(tǒng)模塊的數(shù)據(jù),那么如何來選擇或者過濾只查看指定的系統(tǒng)模塊的日志數(shù)據(jù)?
解決方案:新增標識不同系統(tǒng)模塊的字段或根據(jù)不同系統(tǒng)模塊建ES索引
1、新增標識不同系統(tǒng)模塊的字段,然后在Kibana中可以根據(jù)該字段來過濾查詢不同模塊的數(shù)據(jù),這里以第二種部署架構(gòu)講解,在Filebeat中的配置內(nèi)容為:
filebeat.prospectors: - paths: - /home/project/elk/logs/account.log input_type: log multiline: pattern: '^/[' negate: true match: after fields: //新增log_from字段 log_from: account - paths: - /home/project/elk/logs/customer.log input_type: log multiline: pattern: '^/[' negate: true match: after fields: log_from: customeroutput: logstash: hosts: ["localhost:5044"]
通過新增:log_from字段來標識不同的系統(tǒng)模塊日志
2、根據(jù)不同的系統(tǒng)模塊配置對應(yīng)的ES索引,然后在Kibana中創(chuàng)建對應(yīng)的索引模式匹配,即可在頁面通過索引模式下拉框選擇不同的系統(tǒng)模塊數(shù)據(jù)。
filebeat.prospectors: - paths: - /home/project/elk/logs/account.log input_type: log multiline: pattern: '^/[' negate: true match: after fields: //新增log_from字段 log_from: account - paths: - /home/project/elk/logs/customer.log input_type: log multiline: pattern: '^/[' negate: true match: after fields: log_from: customeroutput: logstash: hosts: ["localhost:5044"]
這里以第二種部署架構(gòu)講解,分為兩步:
① 在Filebeat中的配置內(nèi)容為:
filebeat.prospectors: - paths: - /home/project/elk/logs/account.log input_type: log multiline: pattern: '^/[' negate: true match: after document_type: account - paths: - /home/project/elk/logs/customer.log input_type: log multiline: pattern: '^/[' negate: true match: after document_type: customeroutput: logstash: hosts: ["localhost:5044"]
通過document_type來標識不同系統(tǒng)模塊
② 修改Logstash中output的配置內(nèi)容為:
output { elasticsearch { hosts => "localhost:9200" index => "%{type}" }}
“
在output中增加index屬性,%{type}表示按不同的document_type值建ES索引
”
本文主要介紹了ELK實時日志分析的三種部署架構(gòu),以及不同架構(gòu)所能解決的問題,這三種架構(gòu)中第二種部署方式是時下最流行也是最常用的部署方式。
最后介紹了ELK作在日志分析中的一些問題與解決方案,說在最后,ELK不僅僅可以用來作為分布式日志數(shù)據(jù)集中式查詢和管理,還可以用來作為項目應(yīng)用以及服務(wù)器資源監(jiān)控等場景,更多內(nèi)容請看官網(wǎng)。
本文鏈接:http://www.www897cc.com/showinfo-26-34630-0.htmlSpring Cloud 實現(xiàn)分布式實時日志分析采集的三種方案
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com