利用ELK可視化日志

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)。

image.png

需求分析

在服務(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 fieldcost 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)

image.png

Kibana為我們準(zhǔn)備多種可視化的工具,包括餅圖,折線圖,數(shù)據(jù)表等,下面將對(duì)我們常用的可視化工具進(jìn)行介紹。

  1. 折線圖(Line chart)
    折線圖可以直觀的看出數(shù)據(jù)的走勢(shì)。
    選擇折線圖后會(huì)提示使用新的查詢還是使用已保存的查詢,可以根據(jù)自己的需要選擇
折線圖.png

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


image.png

在折線圖設(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容