(點選上方公眾號,可快速關註)
來源:FEINIK ,
my.oschina.net/feinik/blog/1580625
一、概述
ELK 已經成為目前最流行的集中式日誌解決方案,它主要是由Beats、Logstash、Elasticsearch、Kibana等元件組成,來共同完成實時日誌的收集,儲存,展示等一站式的解決方案。本文將會介紹ELK常見的架構以及相關問題解決。
-
Filebeat:Filebeat是一款輕量級,佔用服務資源非常少的資料收集引擎,它是ELK家族的新成員,可以代替Logstash作為在應用伺服器端的日誌收集引擎,支援將收集到的資料輸出到Kafka,Redis等佇列。
-
Logstash:資料收集引擎,相較於Filebeat比較重量級,但它集成了大量的外掛,支援豐富的資料源收集,對收集的資料可以過濾,分析,格式化日誌格式。
-
Elasticsearch:分散式資料搜尋引擎,基於Apache Lucene實現,可叢集,提供資料的集中式儲存,分析,以及強大的資料搜尋和聚合功能。
-
Kibana:資料的視覺化平臺,透過該web平臺可以實時的檢視 Elasticsearch 中的相關資料,並提供了豐富的圖表統計功能。
二、ELK常見部署架構
2.1、Logstash作為日誌收集器
這種架構是比較原始的部署架構,在各應用伺服器端分別部署一個Logstash元件,作為日誌收集器,然後將Logstash收集到的資料過濾、分析、格式化處理後傳送至Elasticsearch儲存,最後使用Kibana進行視覺化展示,這種架構不足的是:Logstash比較耗伺服器資源,所以會增加應用伺服器端的負載壓力。
2.2、Filebeat作為日誌收集器
該架構與第一種架構唯一不同的是:應用端日誌收集器換成了Filebeat,Filebeat輕量,佔用伺服器資源少,所以使用Filebeat作為應用伺服器端的日誌收集器,一般Filebeat會配合Logstash一起使用,這種部署方式也是目前最常用的架構。
2.3、引入快取佇列的部署架構
該架構在第二種架構的基礎上引入了Kafka訊息佇列(還可以是其他訊息佇列),將Filebeat收集到的資料傳送至Kafka,然後在透過Logstasth讀取Kafka中的資料,這種架構主要是解決大資料量下的日誌收集方案,使用快取佇列主要是解決資料安全與均衡Logstash與Elasticsearch負載壓力。
2.4、以上三種架構的總結
第一種部署架構由於資源佔用問題,現已很少使用,目前使用最多的是第二種部署架構,至於第三種部署架構個人覺得沒有必要引入訊息佇列,除非有其他需求,因為在資料量較大的情況下,Filebeat 使用壓力敏感協議向 Logstash 或 Elasticsearch 傳送資料。如果 Logstash 正在繁忙地處理資料,它會告知 Filebeat 減慢讀取速度。擁塞解決後,Filebeat 將恢復初始速度並繼續傳送資料。
三、問題及解決方案
問題:如何實現日誌的多行合併功能?
系統應用中的日誌一般都是以特定格式進行列印的,屬於同一條日誌的資料可能分多行進行列印,那麼在使用ELK收集日誌的時候就需要將屬於同一條日誌的多行資料進行合併。
解決方案:使用Filebeat或Logstash中的multiline多行合併外掛來實現
在使用multiline多行合併外掛的時候需要註意,不同的ELK部署架構可能multiline的使用方式也不同,如果是本文的第一種部署架構,那麼multiline需要在Logstash中配置使用,如果是第二種部署架構,那麼multiline需要在Filebeat中配置使用,無需再在Logstash中配置multiline。
1、multiline在Filebeat中的配置方式:
filebeat.prospectors:
–
paths:
– /home/project/elk/logs/test.log
input_type: log
multiline:
pattern: ‘^\[‘
negate: true
match: after
output:
logstash:
hosts: [“localhost:5044”]
-
pattern:正則運算式
-
negate:預設為false,表示匹配pattern的行合併到上一行;true表示不匹配pattern的行合併到上一行
-
match:after表示合併到上一行的末尾,before表示合併到上一行的行首
如:
pattern: ‘\[‘
negate: true
match: 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預製的正則匹配樣式,預製的還有好多常用的正則匹配樣式,詳細請看:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns
問題:如何將Kibana中顯示日誌的時間欄位替換為日誌資訊中的時間?
預設情況下,我們在Kibana中檢視的時間欄位與日誌資訊中的時間不一致,因為預設的時間欄位值是日誌收集時的當前時間,所以需要將該欄位的時間替換為日誌資訊中的時間。
解決方案:使用grok分詞外掛與date時間格式化外掛來實現
在Logstash的配置檔案的過濾器中配置grok分詞外掛與date時間格式化外掛,如:
input {
beats {
port => 5044
}
}
filter {
multiline {
pattern => “%{LOGLEVEL}\s*\]\[%{YEAR}%{MONTHNUM}%{MONTHDAY}\s+%{TIME}\]”
negate => true
what => “previous”
}
grok {
match => [ “message” , “(?
%{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,內容為:
CUSTOMER_TIME %{YEAR}%{MONTHNUM}%{MONTHDAY}\s+%{TIME}
註:內容格式為:[自定義運算式名稱] [正則運算式]
然後logstash中就可以這樣取用:
filter {
grok {
patterns_dir => [“./customer-patterms/mypatterns”] //取用運算式檔案路徑
match => [ “message” , “%{CUSTOMER_TIME:customer_time}” ] //使用自定義的grok運算式
}
}
② 以配置項的方式,規則為:(?正則匹配規則),如:
filter {
grok {
match => [ “message” , “(?
%{YEAR}%{MONTHNUM}%{MONTHDAY}\s+%{TIME})” ] }
}
問題:如何在Kibana中透過選擇不同的系統日誌模組來檢視資料
一般在Kibana中顯示的日誌資料混合了來自不同系統模組的資料,那麼如何來選擇或者過濾只檢視指定的系統模組的日誌資料?
解決方案:新增標識不同系統模組的欄位或根據不同系統模組建ES索引
1、新增標識不同系統模組的欄位,然後在Kibana中可以根據該欄位來過濾查詢不同模組的資料
這裡以第二種部署架構講解,在Filebeat中的配置內容為:
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: customer
output:
logstash:
hosts: [“localhost:5044”]
透過新增:log_from欄位來標識不同的系統模組日誌
2、根據不同的系統模組配置對應的ES索引,然後在Kibana中建立對應的索引樣式匹配,即可在頁面透過索引樣式下拉框選擇不同的系統模組資料。
這裡以第二種部署架構講解,分為兩步:
① 在Filebeat中的配置內容為:
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: customer
output:
logstash:
hosts: [“localhost:5044”]
透過document_type來標識不同系統模組
② 修改Logstash中output的配置內容為:
output {
elasticsearch {
hosts => “localhost:9200”
index => “%{type}”
}
}
在output中增加index屬性,%{type}表示按不同的document_type值建ES索引
四、總結
本文主要介紹了ELK實時日誌分析的三種部署架構,以及不同架構所能解決的問題,這三種架構中第二種部署方式是時下最流行也是最常用的部署方式,最後介紹了ELK作在日誌分析中的一些問題與解決方案,說在最後,ELK不僅僅可以用來作為分散式日誌資料集中式查詢和管理,還可以用來作為專案應用以及伺服器資源監控等場景,更多內容請看官網。
【關於投稿】
如果大家有原創好文投稿,請直接給公號傳送留言。
① 留言格式:
【投稿】+《 文章標題》+ 文章連結
② 示例:
【投稿】《不要自稱是程式員,我十多年的 IT 職場總結》:http://blog.jobbole.com/94148/
③ 最後請附上您的個人簡介哈~
看完本文有收穫?請轉發分享給更多人
關註「ImportNew」,提升Java技能