logstash的grok插件的用途是提取字段,將非格式的內容進行格式化,html
input { file { path => "/var/log/http.log" } } filter { grok { match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" } } }
匹配字段以下:git
client: 55.3.244.1github
method: GET正則表達式
request: /index.htmlruby
bytes: 15824app
duration: 0.043ide
更加震撼的是logstash內置不少的正則表達式,參見參考部分的連接。post
例如:對於字符串:測試
Jan 1 06:25:43 mailserver14 postfix/cleanup[21403]: BEF25A72965: message-id=<20130101142543.5828399CCAF@mailserver14.example.com>網站
能夠用以下的解析
1 filter { 2 grok { 3 patterns_dir => ["./patterns"] 4 match => { "message" => "%{SYSLOGBASE} %{POSTFIX_QUEUEID:queue_id}: %{GREEDYDATA:syslog_message}" } 5 } 6 }
其中SYSLOGBASE以及GREEDYDATA都是logstash裏面內置好的解析規則,能夠再上面提供的github中找到,是否是很省勁?
對於POSTFIX_QUEUEID而言,是一個咱們本身定製的一個解析,放在根目錄的patterns路徑下,那麼須要前面的patterns_dir參數中指定一下路徑便可。文件的內容以下:
# contents of ./patterns/postfix:
POSTFIX_QUEUEID [0-9A-F]{10,11}
咱們來看一下grok裏面使人興奮的幾個例子:
1. override:
消息:
May 29 16:37:11 sadness logger: hello world
grok規則:
1 filter { 2 grok { 3 match => { "message" => "%{SYSLOGBASE} %{DATA:message}" } 4 overwrite => [ "message" ] 5 } 6 }
解析結果:
hello world
2. addtag,addfield
處於測試目的,你能但願添加一些字段來輔助跟蹤,或者加強表達內容能夠經過addtag以及addfield來進行統一設置。tag表達式有一個點,就是能夠一次性添加多個,由於這些options的類型都是array,若是是多個,須要用"[... ...]"來包裹。
filter { grok { add_field => { "foo_%{somefield}" => "Hello world, from %{host}" } } } # You can also add multiple fields at once: filter { grok { add_field => { "foo_%{somefield}" => "Hello world, from %{host}" "new_field" => "new_static_value" } } } filter { grok { add_tag => [ "foo_%{somefield}" ] } } # You can also add multiple tags at once: filter { grok { add_tag => [ "foo_%{somefield}", "taggedy_tag"] } }
3. 多個規則匹配
1 filter { 2 grok { 3 match => { "message" => [ "%{NUMBER:duration}", "%{NUMBER:speed}" ] } } 4 }
關於Grok解析
想要測試咱們的grok而是解析正確能夠經過下面的網站進行測試:
http://grokdebug.herokuapp.com/
例如,
1 Demo:Lorry 2018-9-8 11:20:54 2 3 模式:^%{USERNAME:name}$ 4 5 匹配結果: 6 7 { "name": [ [ "Lorry" ] ] }
2.匹配時間
1 Demo:2018-9-8T11:19:57.333 2 模式:%{TIMESTAMP_ISO8601 :lorry} 3 匹配結果 4 { "TIMESTAMP_ISO8601": [ [ "2018-9-8T11:19:57.333" ] ], "YEAR": [ [ "2018" ] ], "MONTHNUM": [ [ "9" ] ], "MONTHDAY": [ [ "8" ] ], "HOUR": [ [ "11", null ] ], "MINUTE": [ [ "19", null ] ], "SECOND": [ [ "57.333" ] ], "ISO8601_TIMEZONE": [ [ null ] ] }
3.下面是一個比較複雜的demo,就是匹配多部分:
1 DemoLorry 2018-9-8T11:19:57.333 2 %{USERNAME:Lorry}%{SPACE}%{TIMESTAMP_ISO8601:time}
Ruby
最後是關於ruby,下面連接中就是一個比較好的Ruby教程,就ruby的語法以及日期等處理方式都有說明。
參考:
1. 關於grok內置好的正則表達式
https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns
2. 下面是一篇很好的介紹logstash的文章(唉,只有google能夠搜獲得)
https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html
3. Ruby教程
https://code.ziqiangxuetang.com/ruby/ruby-tutorial.html