编码插件(Codec)
Codec 是 logstash 从 1.3.0 版开始新引入的概念(Codec 来自 Coder/decoder 两个单词的首字母缩写)。
在此之前,logstash 只支持纯文本形式输入,然后以过滤器处理它。但现在,我们可以在输入 期处理不同类型的数据,这全是因为有了 codec 设置。
所以,这里需要纠正之前的一个概念。Logstash 不只是一个input | filter | output
的数据流,而是一个 input | decode | filter | encode | output
的数据流!codec 就是用来 decode、encode 事件的。
codec 的引入,使得 logstash 可以更好更方便的与其他有自定义数据格式的运维产品共存,比如 graphite、fluent、netflow、collectd,以及使用 msgpack、json、edn 等通用数据格式的其他产品等。
事实上,我们在第一个 “hello world” 用例中就已经用过 codec 了 —— rubydebug 就是一种 codec!虽然它一般只会用在 stdout 插件中,作为配置测试或者调试的工具。
1,采用json编码
这里通过nginx日志作为案例测试学习使用。修改nginx配置文件,将日志以json格式存储:
log_format json '{"@timestamp":"$time_iso8601",' '"@version":"1",' '"host":"$server_addr",' '"client":"$remote_addr",' '"size":$body_bytes_sent,' '"responsetime":$request_time,' '"domain":"$host",' '"url":"$uri",' '"status":"$status"}'; access_log /logs/nginx/access.log json;
重启nginx使其生效。
设置测试使用的logstash配置文件webnginx.conf:
input { file { path => "/logs/nginx/access.log" type => "nginx" start_position => "beginning" add_field => { "key"=>"value"} codec => "json" } } output { stdout{ codec => rubydebug{ } } }
logstash加载启动测试:
logstash -f webnginx.conf
访问测试地址,显示如下(这里我将www.elk.com定向到了nginx所在的虚拟机)
{ "type" => "nginx", "url" => "/app/panels/timepicker/module.html", "tags" => [], "path" => "/logs/nginx/access.log", "@timestamp" => 2017-02-13T17:02:47.000Z, "size" => 2397, "domain" => "www.elk.com", "@version" => "1", "host" => "192.168.1.104", "client" => "192.168.2.16", "responsetime" => 0.0, "key" => "value", "status" => "200" }
补充说明:
日志格式中统一记录为字符串格式(即都带上双引号 “),然后再在 logstash 中用 filter/mutate 插件来变更应该是数值类型的字符字段的值类型。
2,合并多行数据(Multiline)
有些时候,应用程序调试日志会包含非常丰富的内容,为一个事件打印出很多行内容。这种日志通常都很难通过命令行解析的方式做分析。 logstash 正为此准备好了 codec/multiline 插件。测试:
input { stdin { codec => multiline { pattern => "^\[" negate => true what => "previous" } } } output { stdout { codec => rubydebug{ } } }
加载:logstash -f multiline.conf
效果如下:
hello world hello logstash hello multiline [ { "@timestamp" => 2017-02-13T17:29:47.658Z, "@version" => "1", "host" => "0.0.0.0", "message" => "[\nhello world\nhello logstash\nhello multiline", "tags" => [ [0] "multiline" ] }
这个插件的原理很简单,就是把当前行的数据添加到前面一行后面,直到新进的当前行匹配 ^\[ 正则为止。这个正则还可以用 grok 表达式。
参考文章:
http://kibana.logstash.es/content/logstash/plugins/codec/multiline.html