記一次Docker下安裝Logstash Elasticsearch Kibana經歷

前言

最近遇到一個困惑,在kibana上撈客戶端使用者行為相關的資料,無奈無法提取一個欄位中的kv值。作為一個移動開發人員,對這種東西簡直就是日了狗了,請教了下公司推薦組的人,也沒有得到結果,靠人不如靠自己去。

這個資料在kibana上顯示的是一個用英文逗號分隔,用等號連線的鍵值對,假設這個欄位顯示的是args,其值為:

args:key1=value1,key2=value2,key3=value3

而我想要的結果就是提取args中的鍵值對到外層,便於進行一些圖表方面的統計,比如某個欄位的成功率等,提取後的內容如下:

args:key1=value1,key2=value2,key3=value3
key1:value1
key2:value2
key3:value3

在這之前,需要把對應的環境先搭建起來,這裡使用Docker進行搭建,對Logstash Elasticsearch Kibana不瞭解的可以簡單瞭解下這篇文章,ELKstack 中文指南。而Logstash,個人找到一篇相對比較詳細入門的介紹,也可以看下logstash快速入門,在寫這篇文章之前,我個人也是對這三個東西一無所知,完全從0開始。

Elasticsearch的安裝

Mac下Docker的安裝見Mac OSX Docker下搭建Android Jenkins Gitlab,elasticsearch需要暴露兩個埠,9200和9300,我們直接使用docker run命令執行一個elasticsearch容器。

docker run --name myes -d -p 9200:9200 -p 9300:9300 elasticsearch

容器執行起來後可以在日誌中找到對應的ip:port,注意這裡不能使用localhost,具體原因可能localhost指的是該容器本身,而我們需要在另一個容器中訪問該容器,因此需要。。。。(計算機網路的內容忘得差不多了,專業術語無視就好)

這裡寫圖片描述

從圖中看到,ip加埠的值為172.17.0.2:9200

kibana的安裝

kibana容器的執行需要指定elasticsearch的url,通過環境變數傳遞進去即可,並暴露預設埠5601供瀏覽器訪問

docker run --name mykibana -e ELASTICSEARCH_URL=http://172.17.0.2:9200 -p 5601:5601 -d kibana

到目前為止,還沒有日誌輸入到es中,kibana自然也沒有什麼內容可以查詢了。

Logstash的安裝

docker執行logstash的容器的時候,需要指定輸入輸出及過濾器,我們先使用控制檯輸入,然後輸出到控制檯。

docker run -it --rm logstash -e 'input { stdin { } } output { stdout { } }'

然後在控制檯輸入helloworld,你就能立即看到輸出了

這裡寫圖片描述

文章開頭說到了日誌內容不能被解析的問題,簡單嘗試了下,可以進行解析,不過需要對logstash的配置進行修改

input { 
//控制檯輸入
stdin { } 
} 
filter { 
//kv外掛,每一對使用|分割,kv使用=分割
kv { 
source => "message" 
field_split => "|" 
value_split => "=" 
} 
//將args作為輸入再次分割
kv {
source => "args" 
field_split => "&"
value_split => "=" 
}
} 
output { 
//輸出到es
elasticsearch {  
hosts => ["172.17.0.2:9200"] 
} 
//同時輸出到控制檯
stdout { 
codec => rubydebug 
} 
}

這裡使用了kv外掛進行解析,舉一個例子,我的日誌輸入內容為:

arg1=a1|arg2=b2|arg3=c3|args=a=b&b=c&c=d&d=e

最終上面的內容會被解析成

arg1=a1
arg2=b2
arg3=c3
a=b
b=c
c=d
d=e

執行docker命令,傳入剛剛的logstash的配置

docker run -it --rm logstash -e 'input { stdin { } } filter { kv { source => "message" field_split => "|" value_split => "=" } kv { source => "args" field_split => "&" value_split => "=" } } output { elasticsearch {  hosts => ["172.17.0.2:9200"] } stdout { codec => rubydebug } }'

在控制檯中輸入

arg1=a1|arg2=b2|arg3=c3|args=a=b&b=c&c=d&d=e

然後控制檯就會輸出解析後的內容

這裡寫圖片描述

開啟kibana驗證一下,瀏覽器輸入http://localhost:5601/,先建立索引,直接點選create即可

這裡寫圖片描述

然後就能看的解析後的內容了

這裡寫圖片描述

如果欄位上出現黃色的警告,必要時到Setting Tab重新整理一下filed list即可。

總結

經過自己的一番實驗,對於args中的內容,解析出來是完全沒有什麼問題的,關鍵在於logstash的配置問題,然後問題並沒有這麼簡單,對於同一個配置,發現一部分日誌中的args能被解析出來,還有大部分的日誌的args並不能解析出來,這個原因沒找到。。。。。同一種方式解析,理論上應該不存在一部分解析的出來一部分解析不出來,除非使用的配置是不一樣的。