Logstash不只是一个input|filter|output
的数据流,而是一个input|decode|filter|encode|output
的数据流。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消耗
使用:
input {
stdin {
codec => json
}
}
multiline插件:
用于合并多行数据
有些时候,应用程序调试日志会包含非常丰富的内容,为一个事件打印出很多行内容。这种日志通常都很难通过命令行解析的方式做分析。multiline插件用于解决此类问题。
示例:
tomcat的日志catalina.out有很多调试的日志,日志都以时间戳格式"20-Apr-2016 11:29:28.535"开头,那么我们可以配置如下:
input {
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秒没有新数据产生,那么最后一个时间戳格式后的所有行数据就是最后一个事件。