Logstash不隻是一個<code>input|filter|output</code>的資料流,而是一個<code>input|decode|filter|encode|output</code>的資料流。codec就是用來decode,encode 事件的。是以codec常用在input和output中
常用的codec插件有plain,json,multiline等
plain插件:
主要用于事件之間沒有分隔的純文字。
使用:
input {
stdin {
codec => plain {}
}
}
示例:
logstash事件output到kafka預設的codec為json,如果設定codec為plain,除了message資料之外還會有一個主機名和時間戳的字段生成,如果隻需要message字段,配置如下:
output {
kafka {
codec => plain {
format => "%{message}"
}
json插件:
如果資料為json格式,可直接使用該插件,進而省掉filter/grok的配置,降低過濾器的cpu消耗
codec => json
multiline插件:
用于合并多行資料
有些時候,應用程式調試日志會包含非常豐富的内容,為一個事件列印出很多行内容。這種日志通常都很難通過指令行解析的方式做分析。multiline插件用于解決此類問題。
tomcat的日志catalina.out有很多調試的日志,日志都以時間戳格式"20-Apr-2016 11:29:28.535"開頭,那麼我們可以配置如下:
file {
path => "/path/to/catalina.out"
start_position => "beginning"
type => "tomcat_log"
codec => multiline {
pattern => "^%{MONTHDAY}[./-]%{MONTH}[./-]%{YEAR}"
auto_flush_interval => 10
negate => true
what => "previous"
pattern為正規表達式比對
negate為布爾類型,true表示否定正規表達式,即不比對正規表達式。false為比對正規表達式。預設值為false
what表示如果正則比對與否,事件屬于上一個或者下一個事件。有兩個值可選previous(上一個)或者next(下一個)
auto_flush_interval表示當多長時間沒有新的資料,之前積累的多行資料轉換為一個事件。這裡的10表示10秒
以上的配置可以解釋為:不比對pattern時間戳格式開頭的行資料,都歸屬到上一個事件中,即在下一個比對的時間戳出現之前的所有行的輸出都屬于同一個事件,進而達到合并多行的目的,同時等待10秒沒有新資料産生,那麼最後一個時間戳格式後的所有行資料就是最後一個事件。
本文轉自 曾哥最愛 51CTO部落格,原文連結:http://blog.51cto.com/zengestudy/1832801,如需轉載請自行聯系原作者