概述
日誌系統ELK使用詳解(一)–如何使用
日誌系統ELK使用詳解(二)–Logstash安裝和使用
日誌系統ELK使用詳解(三)–elasticsearch安裝
日誌系統ELK使用詳解(四)–kibana安裝和使用
日誌系統ELK使用詳解(五)–補充
在開始之前先說一下Logstash的使用和熟悉路線圖。接觸ELK的時候不能圖快,可以嘗試着一部分一部分的安裝起來熟悉,之後再逐個組裝到一起,看效果。
Logstash的獨立性很高,熟悉路線可以按照這樣來:
1.最基本的就是接收控制檯輸入,然後解析輸出到控制檯。
2.從文件讀入,解析輸出到控制檯。
3.從文件讀入,解析輸出到elasticsearch。
4.實際應用中需要打通的關節。
接下來一起看一下Logstash,這個系列使用的版本(Logstash5.3.0)下載地址是:https://www.elastic.co/cn/downloads
安裝
1.安裝JDK 1.8.0_65
2.下載logstash5.3.0
3.解壓logstash
控制檯—》控制檯
1.在…/logstash-5.3.0/bin/目錄中新建一個文件std_std.conf文件
2.錄入如下內容:
input {
stdin{
}
}
output {
stdout{
}
}
3.在bin目錄執行命令:./logstash -f std_std.conf
4.稍等片刻,看到如下信息,說明啓動完成了:
5.輸入hello logstash!!!!,logash會在控制檯回寫出來這條信息:
文件—-》控制檯
這裏使用的文件是tomcat輸出的access日誌文件,很常見,內容如下:
111.206.36.140 - - [10/Aug/2016:23:16:29 +0800] "GET /nggirl-web/web/admin/work/special/listSelectedWork/v1.4.0?workIds=780 HTTP/1.1" 200 78 "http://www.baidu.com/s?wd=www" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"
111.206.36.140 - - [10/Aug/2016:23:16:29 +0800] "GET /nggirl-web/web/admin/work/special/listSelectedWork/v1.4.0?workIds=780 HTTP/1.1" 200 78 "http://www.baidu.com/s?wd=www" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"
1.在bin目錄新建file_std.conf文件;
2.內容如下:
input{
file{
path =>"/Develop/Tools/apache-tomcat-8.0.30/webapps/nggirllog/access.log"
start_position=>"beginning"
}
}
filter{
grok{
match=>{
"message"=>"%{DATA:clientIp} - - \[%{HTTPDATE:accessTime}\] \"%{DATA:method} %{DATA:requestPath} %{DATA:httpversion}\" %{DATA:retcode} %{DATA:size} \"%{DATA:fromHtml}\" \"%{DATA:useragent}\""
}
remove_field=>"message"
}
date{
match=>["accessTime","dd/MMM/yyyy:HH:mm:ss Z"]
}
}
output{
stdout{
codec=>rubydebug
}
}
3.然後運行./logstash -f file_std.conf,就會看到文件中原有的內容被逐條的顯示在命令行了。
這個配置文件相對比較複雜,而且我們一般在使用elk的時候logstash的配置文件基本也是和這個類似,大同小異了,這裏對關鍵部分詳細解說一下。更深入的內容和使用方式,大家可以到elastic官網或者到logstash的最佳實戰頁面去看,網址是:http://udn.yyuap.com/doc/logstash-best-practice-cn/index.html。
input/file/path:這裏指定了要對哪個日誌文件進行掃描。如果希望掃描多個文件,可以使用*這個路徑通配符;或者使用多個日誌路徑以數組形式提供(path=>[“outer-access.log”,”access.log”]);或者直接給定一個目錄,logstash會掃描所有的文件,並監聽是否有新文件。
filter/grok/match/message:裏面的DATA和HTTPDATE都是grok語法內置的正則表達式,DATA匹配任意字符,HTTPDATE匹配joda類型的日期格式字符。上例中”\[“是匹配“[”。
filter/grok/match/date: 是對HTTPDATE日期格式的解釋,joda可以支持很多複雜的日期格式,需要在這裏指明才能正確匹配。
remove_field=>”message”:用處是去掉原有的整個日誌字符串,僅保留filter解析後的信息。你可以試着去掉這一句就明白他的用處了。
解析成功後會看到控制檯中類似如下的內容:
文件到elasticsearch
1.在bin目錄新建file_es.conf文件
2.錄入如下內容,和上一個例子的區別僅在於out部分:
input{
file{
path =>"/Develop/Tools/apache-tomcat-8.0.30/webapps/nggirllog/access*.log"
start_position=>"beginning"
}
}
filter{
grok{
match=>{
"message"=>"%{DATA:clientIp} - - \[%{HTTPDATE:accessTime}\] \"%{DATA:method} %{DATA:requestPath} %{DATA:httpversion}\" %{DATA:retcode} %{DATA:size} \"%{DATA:fromHtml}\" \"%{DATA:useragent}\""
}
remove_field=>["message"]
}
date{
match=>["accessTime","dd/MMM/yyyy:HH:mm:ss Z"]
}
}
output {
elasticsearch {
hosts => "127.0.0.1"
}
stdout { codec => rubydebug}
}
3.執行./logstash -f file_es.conf
由於我們還沒有開始部署elasticsearch,暫時不貼出效果,效果圖將在下一個博客裏面看到。
多行日誌的處理
通過上面3步的熟悉,我們大概清楚了logstash的工作過程:
1.input讀取指定文件裏面的文本行,這裏是一行一行讀取的;
2.然後filter對讀入的每一行進行解析,拆分成一組一組的key-value值;
3.out將解析後的結果輸出寫入到指定的系統。
但是,我們知道異常日誌是一個多行文本,我們需要把多行信息輸出到一行裏面去處理,那麼怎麼辦呢?
如果仍然按照單行文本的類似處理方式的話,我們需要在input部分添加配置項,如下:
input {
stdin {
codec => multiline {
pattern => "^\["
negate => true
what => "previous"
}
}
}
這個配置是對每一個以”[“開頭的行認作一個數據行的開始,後續不是以”[“開頭的行都會認爲是同一個數據的內容,當再次遇到”[“時結束這一個數據內容的讀取,開始下一行。
這裏有一個問題是,最後一個異常日誌不能輸出,因爲logstash一直在等待下一個”[“的出現,但是一直沒有出現,那麼就不會輸出了。
我們採用的處理多行文本的方式是自己實現了一個LogAppender,直接由程序日誌類庫以json串的形式輸出到redis中,然後再由logstash讀取。架構方式上屬於第一篇中寫的第二種架構方式。
以下是一些關鍵部分的代碼片段:
補充:如果需要屏蔽不需要的日誌,可以參見這裏:http://www.tuicool.com/articles/Ubeiaea