ELK是elasticsearch,logstash, kibana的簡(jiǎn)稱,是基于elasticsearch的日志收集、分析工具。在實(shí)際的生產(chǎn)中被許多公司作為日志方案而應(yīng)用。
首先介紹一下基本的概念
elasticsearch是一款全文搜索引擎,其底層是java生態(tài)圈中著名的搜索引擎Lucene,但elasticsearch對(duì)Lucene進(jìn)行了封裝,提供了Rest API,開箱即用。
logstash是一個(gè)事件處理的管道(pipeline),我們可以將事件推送給它,并且可以對(duì)其進(jìn)行操作之后將其推送到不同的后端(對(duì)于我們來說就是elasticsearch)。
Kibana是一個(gè)可視化的頁(yè)面,我們可以方便的在頁(yè)面上進(jìn)行數(shù)據(jù)的基礎(chǔ)、高級(jí)查詢,也可以對(duì)數(shù)據(jù)進(jìn)行分析。在本文中日志分析處理后的結(jié)果都會(huì)在Kibana中體現(xiàn)。

需求分析
在服務(wù)的運(yùn)行過程中,我們需要一些指標(biāo)來衡量服務(wù)當(dāng)前的性能、健康狀況等。由于某型指標(biāo)與具體的業(yè)務(wù)息息相關(guān),因此單單依靠一些系統(tǒng)的監(jiān)控(如jvm,內(nèi)存)是無法全景展現(xiàn)服務(wù)的真實(shí)運(yùn)行情況的,而如果能有效利用elasticsearch的特性就有可能做到對(duì)服務(wù)做到完整的監(jiān)控。
準(zhǔn)備工作
首先我們需要知道的是,elasticsearch并不僅僅是一款全文搜索引擎,它還有許多其它的功能及應(yīng)用場(chǎng)景,實(shí)時(shí)的計(jì)算統(tǒng)計(jì)數(shù)值型數(shù)據(jù)就是其中一個(gè)重要功能,而Kibana可以直觀的將我們的統(tǒng)計(jì)結(jié)果以圖表的方式展現(xiàn)給我們。但這有一個(gè)前提是,我們必須使用數(shù)值型數(shù)據(jù),否則elasticsearch將無法計(jì)算。
使用Grok filter 插件
Grok插件是一個(gè)將非結(jié)構(gòu)化日志數(shù)據(jù)解析為結(jié)構(gòu)化和可查詢數(shù)據(jù)的插件。
grok語(yǔ)法是%{SYNTAX:SEMANTIC}
SYNTAX是需要匹配的語(yǔ)法模式,比如3.44是一個(gè)數(shù)字,則我們可將其匹配為NUMBER模式,192.168.1.10是IP地址,那么我們可以將其匹配為IP。
SEMANTIC是需要匹配的文本的標(biāo)識(shí)符, 比如剛才的3.44指的是調(diào)用接口的耗時(shí),那么我們可以將其命名為duration,192.168.1.10是調(diào)用的服務(wù)端的IP, 我們將其命名為server_host,那么最終處理的結(jié)果就是就是
{
"duration":3.44,
"server_host":"192.168.1.10"
}
現(xiàn)在我們舉一個(gè)更貼近實(shí)際使用的例子。
我們有一個(gè)記錄服務(wù)請(qǐng)求的日志,所有請(qǐng)求都會(huì)記錄為以下格式
request: stopActivity, cost: 121
我們可以設(shè)置以下匹配規(guī)則
filter {
grok {
match => {"message" => "request: %{WORD:method} cost: %{NUMBER:elapsed:int}"}
overwrite => ["message"]
named_captures_only => true
}
}
match 中設(shè)置了我們匹配了request: 后的文本以及cost: 后的數(shù)字,我們最終在可以得到method field與cost field中的值。
解釋一下cost: %{NUMBER:cost:int}是什么意思。
在grok的文檔中有這么一段,
Optionally you can add a data type conversion to your grok pattern. By default all semantics are saved as strings. If you wish to convert a semantic’s data type, for example change a string to an integer then suffix it with the target data type. For example %{NUMBER:num:int} which converts the num semantic from a string to an integer. Currently the only supported conversions are int and float.
named_captures_only => true 這個(gè)函數(shù)用來告訴filter我們只對(duì)符合匹配規(guī)則的字段進(jìn)行處理,不符合匹配規(guī)則的日志會(huì)增加一個(gè)名為_grokparsefailure的tag
可視化展現(xiàn)

Kibana為我們準(zhǔn)備多種可視化的工具,包括餅圖,折線圖,數(shù)據(jù)表等,下面將對(duì)我們常用的可視化工具進(jìn)行介紹。
- 折線圖(Line chart)
折線圖可以直觀的看出數(shù)據(jù)的走勢(shì)。
選擇折線圖后會(huì)提示使用新的查詢還是使用已保存的查詢,可以根據(jù)自己的需要選擇

在本文中我們選擇From a New Search, Select Index

在折線圖設(shè)置中我們可以分別配置Y軸與X軸的數(shù)據(jù),在上圖的例子中我在Y軸中使用了上一節(jié)中通過grok插件獲取的elapsed并展現(xiàn)其每分鐘的平均值與最大值。
參考文檔
http://www.ruanyifeng.com/blog/2017/08/elasticsearch.html
https://www.elastic.co/blog/little-logstash-lessons-part-using-grok-mutate-type-data
http://m.itdecent.cn/p/9170a7a65dd4
https://discuss.elastic.co/t/grok-number-field-type-creating-field-as-string-and-not-number/98906
https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html