Logstash中grok filter example例子

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的實例
  1. 我有一段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}: (.*)"
           }
  2. 我有一段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}"}這樣一句話搞定,

  3. 我有一段nginx的日誌

    55.3.244.1 GET /index.html 15824 0.043

    表達式可以像下面那樣寫

    %{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}
  4. 驗證你寫的表達式是否正確

    可以到這個驗證網站驗證一下你寫的是否正確

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章