分布式實(shí)時(shí)日志:ELK 的部署架構(gòu)方案

一、概述
ELK 已經(jīng)成為目前最流行的集中式日志解決方案,它主要是由 Beats、Logstash、Elasticsearch、Kibana 等組件組成,來(lái)共同完成實(shí)時(shí)日志的收集,存儲(chǔ),展示等一站式的解決方案。本文將會(huì)介紹ELK常見的架構(gòu)以及相關(guān)問題解決。
Filebeat:Filebeat是一款輕量級(jí),占用服務(wù)資源非常少的數(shù)據(jù)收集引擎,它是ELK家族的新成員,可以代替 Logstash 作為在應(yīng)用服務(wù)器端的日志收集引擎,支持將收集到的數(shù)據(jù)輸出到Kafka,Redis等隊(duì)列。
Logstash:數(shù)據(jù)收集引擎,相較于Filebeat比較重量級(jí),但它集成了大量的插件,支持豐富的數(shù)據(jù)源收集,對(duì)收集的數(shù)據(jù)可以過(guò)濾,分析,格式化日志格式。
Elasticsearch:分布式數(shù)據(jù)搜索引擎,基于Apache Lucene實(shí)現(xiàn),可集群,提供數(shù)據(jù)的集中式存儲(chǔ),分析,以及強(qiáng)大的數(shù)據(jù)搜索和聚合功能。
Kibana:數(shù)據(jù)的可視化平臺(tái),通過(guò)該web平臺(tái)可以實(shí)時(shí)的查看 Elasticsearch 中的相關(guān)數(shù)據(jù),并提供了豐富的圖表統(tǒng)計(jì)功能。
二、ELK常見部署架構(gòu)
2.1 Logstash作為日志收集器
這種架構(gòu)是比較原始的部署架構(gòu),在各應(yīng)用服務(wù)器端分別部署一個(gè) Logstash 組件,作為日志收集器,然后將 Logstash 收集到的數(shù)據(jù)過(guò)濾、分析、格式化處理后發(fā)送至Elasticsearch 存儲(chǔ),最后使用 Kibana 進(jìn)行可視化展示,這種架構(gòu)不足的是:
Logstash 比較耗服務(wù)器資源,所以會(huì)增加應(yīng)用服務(wù)器端的負(fù)載壓力。

2.2 Filebeat作為日志收集器

2.3 引入緩存隊(duì)列的部署架構(gòu)

2.4 以上三種架構(gòu)的總結(jié)
三、問題及解決方案
問題:如何實(shí)現(xiàn)日志的多行合并功能?
系統(tǒng)應(yīng)用中的日志一般都是以特定格式進(jìn)行打印的,屬于同一條日志的數(shù)據(jù)可能分多行進(jìn)行打印,那么在使用ELK收集日志的時(shí)候就需要將屬于同一條日志的多行數(shù)據(jù)進(jìn)行合并。
解決方案:使用 Filebeat 或 Logstash 中的 multiline 多行合并插件來(lái)實(shí)現(xiàn)。
1、multiline 在 Filebeat 中的配置方式:

pattern:正則表達(dá)式; negate:默認(rèn)為false,表示匹配pattern的行合并到上一行;true表示不匹配pattern的行合并到上一行; match:after表示合并到上一行的末尾,before表示合并到上一行的行首。
如:
pattern: ‘[‘
negate: true
match: after

(1)Logstash 中配置的 what 屬性值為 previous,相當(dāng)于 Filebeat 中的 after,Logstash 中配置的 what 屬性值為 next,相當(dāng)于 Filebeat 中的 before。
(2)pattern => “%{LOGLEVEL}\s*]“ 中的LOGLEVEL是Logstash預(yù)制的正則匹配模式,預(yù)制的還有好多常用的正則匹配模式,詳細(xì)請(qǐng)看:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns
問題:如何將 Kibana 中顯示日志的時(shí)間字段替換為日志信息中的時(shí)間?
默認(rèn)情況下,我們?cè)?Kibana 中查看的時(shí)間字段與日志信息中的時(shí)間不一致,因?yàn)槟J(rèn)的時(shí)間字段值是日志收集時(shí)的當(dāng)前時(shí)間,所以需要將該字段的時(shí)間替換為日志信息中的時(shí)間。
解決方案:使用 grok 分詞插件與 date 時(shí)間格式化插件來(lái)實(shí)現(xiàn)
在 Logstash 的配置文件的過(guò)濾器中配置 grok 分詞插件與 date 時(shí)間格式化插件,如:

CUSTOMER_TIME %{YEAR}%{MONTHNUM}%{MONTHDAY}\s+%{TIME}
注:內(nèi)容格式為:[自定義表達(dá)式名稱] [正則表達(dá)式]
然后 logstash 中就可以這樣引用:

② 以配置項(xiàng)的方式,規(guī)則為:(?<自定義表達(dá)式名稱>正則匹配規(guī)則),如:

問題:如何在Kibana中通過(guò)選擇不同的系統(tǒng)日志模塊來(lái)查看數(shù)據(jù)
一般在Kibana中顯示的日志數(shù)據(jù)混合了來(lái)自不同系統(tǒng)模塊的數(shù)據(jù),那么如何來(lái)選擇或者過(guò)濾只查看指定的系統(tǒng)模塊的日志數(shù)據(jù)?
解決方案:新增標(biāo)識(shí)不同系統(tǒng)模塊的字段或根據(jù)不同系統(tǒng)模塊建ES索引
1、新增標(biāo)識(shí)不同系統(tǒng)模塊的字段,然后在Kibana中可以根據(jù)該字段來(lái)過(guò)濾查詢不同模塊的數(shù)據(jù)
這里以第二種部署架構(gòu)講解,在 Filebeat 中的配置內(nèi)容為:

通過(guò)新增:log_from字段來(lái)標(biāo)識(shí)不同的系統(tǒng)模塊日志
2、根據(jù)不同的系統(tǒng)模塊配置對(duì)應(yīng)的ES索引,然后在Kibana中創(chuàng)建對(duì)應(yīng)的索引模式匹配,即可在頁(yè)面通過(guò)索引模式下拉框選擇不同的系統(tǒng)模塊數(shù)據(jù)。
這里以第二種部署架構(gòu)講解,分為兩步:
① 在Filebeat中的配置內(nèi)容為:

通過(guò)document_type來(lái)標(biāo)識(shí)不同系統(tǒng)模塊
② 修改Logstash中output的配置內(nèi)容為:
在 output 中增加 index 屬性,%{type}表示按不同的document_type值建ES索引
四、總結(jié)
來(lái)源:https://my.oschina.net/feinik/blog/1580625
