title: Logstash中grok filter example例子
date: 2017-02-28
tags: 大數據
一、Logstash
本文適合有部分Logstash經驗的人閱讀,如果不懂Logstash是什麼,請多加google,後面我會繼續整理的
1、filters
Logstash核心組成部分就包括filters,這是個過濾器。一般日誌中還是有很多有用信息的,利用Logstash的filter機制可以將這些信息抽取出來
1)、JSON Filter
這種方式對於日誌數據源是json格式的比較有效,這裏我不多講,一般人日誌不會特意弄成json格式的吧…
2)、Grok Filter
這種方式是我今天重點記錄的,Grok是一種數據格式化工具,利用它就可以進行定製我們的格式化請求了。
我們先來看一段實例:
input {stdin{}}
filter{
grok {
match => {
"message"=>"20%{YEAR:year}-%{MONTHNUM:month}-%{MONTHDAY:day} %{HOUR:hour}:?%{MINUTE:minutes}(?::?%{SECOND:second}) \[%{LOGLEVEL:level}\] appname._log%{NAGIOSTIME:linenumber}: (.*)"
}
}
}
output {stdout{}}
input和output我省略了,這段代碼重點看的是filter部分。其實就是一些類似正則表達式的東西,然後去匹配我們的log,然後轉成一個個json,然後發給output,output我設置的es。
看了上面的匹配例子,大概心裏有個底,長什麼樣子,下面來解析
牢記,每一個小表達式的樣子就是
%{IP:client}
這種辣麼IP是什麼?client是什麼?IP是一種模式的名稱,能夠自動去匹配你log中的部分,這裏IP顧名思義,看到了ip地址如127.0.0.1就會給這一條log起個key值,key是client,所以json裏面就會多一條數據,多一條client=>127.0.0.1這樣的
現有的模式我去哪裏找?
這個問題問得比較好,官方其實是支持很多的,讓我們來看看支持列表點擊這裏
上面的這個是Logstash1.4.2支持的,爲什麼沒有新版的呢???這個問題下面回答
爲什麼沒有新版的Logstash支持的patterns
在新版本的logstash裏面,pattern目錄已經爲空,最後一個commit提示core patterns將會由logstash-patterns-core gem來提供,該目錄可供用戶存放自定義patterns,啥意思?也就是說用戶可以自定義一些pattern然後保存在本地
怎麼自定義
這裏先留着,官方文檔有,以後補充
這麼麻煩,還有沒有現成的?
答案是有,很多人幫你封裝好了,地址在這裏 ,這個是別人整理好的一些pattern,你可以按照他的安裝方法,然後直接調用,裏面有一些非常實用的表達式,比如可以直接解析tomcat打印出來的日誌,直接一個表達式就搞定
TOMCATLOG
下面我們來看一下grok的實例
我有一段thinkphp這樣的日誌:
2016-12-19 14:36:26,298 [INFO] appname._log[95]: send sms use channel :6 2016-12-19 14:36:26,338 [INFO] appname._log[95]: send email use channel :4 2016-12-19 14:36:26,498 [INFO] appname._log[95]: send email use channel :6
首先要分析一下日誌結構,才能寫出相應的解析代碼
日誌結構:日期+[日誌級別]+appname._log[行號]:詳情
日期用年月日表示
20%{YEAR:year}-%{MONTHNUM:month}-%{MONTHDAY:day} %{HOUR:hour}:?%{MINUTE:minutes}(?::?%{SECOND:second})
日誌級別:
%{LOGLEVEL:level}
詳情: (.*) 直接這個表達式搞定
其他特殊符號:比如說逗號,- 號等,我們可以原樣寫出即可,部分可能需要轉義
所以整體上面是這樣的
match => { "message"=>"20%{YEAR:year}-%{MONTHNUM:month}-%{MONTHDAY:day} %{HOUR:hour}:?%{MINUTE:minutes}(?::?%{SECOND:second}) \[%{LOGLEVEL:level}\] appname._log%{NAGIOSTIME:linenumber}: (.*)" }
我有一段tomcat的日誌
2016-12-28 14:55:05,062 INFO |XmlWebApplicationContext |Closing Root WebApplicationContext: startup date [Wed Dec 28 14:46:44 CST 2016]; root of context hierarchy 2016-12-28 14:55:06,062 INFO |XmlWebApplicationContext |Closing Root WebApplicationContext: startup date [Wed Dec 28 14:46:44 CST 2016]; root of context hierarchy 2016-12-28 14:55:07,062 INFO |XmlWebApplicationContext |Closing Root WebApplicationContext: startup date [Wed Dec 28 14:46:44 CST 2016]; root of context hierarchy 2016-12-28 14:55:08,062 INFO |XmlWebApplicationContext |Closing Root WebApplicationContext: startup date [Wed Dec 28 14:46:44 CST 2016]; root of context hierarchy
同樣分析結構,如果安裝了上面說的那個插件的話,就可以直接
match => {"message" => "%{TOMCATLOG}"}
這樣一句話搞定,我有一段nginx的日誌
55.3.244.1 GET /index.html 15824 0.043
表達式可以像下面那樣寫
%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}
驗證你寫的表達式是否正確
可以到這個驗證網站驗證一下你寫的是否正確