使用Losgtash解析日志

时间:2016-02-16 09:59:11

标签: logstash logstash-grok logstash-configuration

我正在使用Logstash来解析日志文件。示例日志行如下所示。

2011/08/10 09:51:34.450457,1.048908,tcp,213.200.244.217,47908, - >,147.32.84.59,6881,S_RA,0,0,4,244,124,flow = Background-Established-cmpgw- CVUT

我在配置文件中使用了以下过滤器。

 grok {
       match => ["message","%{DATESTAMP:timestamp},%{BASE16FLOAT:value},%{WORD:protocol},%{IP:ip},%{NUMBER:port},%{GREEDYDATA:direction},%{IP:ip2},%{NUMBER:port2},%{WORD:status},%{NUMBER:port3},%{NUMBER:port4},%{NUMBER:port5},%{NUMBER:port6},%{NUMBER:port7},%{WORD:flow}" ]
    }

适用于无错误的日志行。但是当我有一条如下所示的线时,它会失败。请注意,缺少第二个字段。

2011/08/10 09:51:34.450457 ,,, tcp,213.200.244.217,47908, - >,147.32.84.59,6881,S_RA,0,0,4,244,124,flow = Background-Established-cmpgw-CVUT

如果缺少值,我想在输出Json对象中放置一个默认值。我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

对第二个字段使用(%{BASE16FLOAT:value})?使其成为可选字段 - 即。正则表达式()?

即使第二个字段为空,grok也能正常工作。

所以整个grok看起来像这样:

%{DATESTAMP:timestamp},(%{BASE16FLOAT:value})?,%{WORD:protocol},%{IP:ip},%{NUMBER:port},%{GREEDYDATA:direction},%{IP:ip2},%{NUMBER:port2},%{WORD:status},%{NUMBER:port3},%{NUMBER:port4},%{NUMBER:port5},%{NUMBER:port6},%{NUMBER:port7},%{WORD:flow}

答案 1 :(得分:0)

在conf文件中使用它。现在,如果value字段为空,则会在响应中省略它。

input {
   stdin{
   }
}
filter {

grok {
       match => ["message","%{DATESTAMP:timestamp},%{DATA:value},%{WORD:protocol},%{IP:ip},%{NUMBER:port},%{GREEDYDATA:direction},%{IP:ip2},%{NUMBER:port2},%{WORD:status},%{NUMBER:port3},%{NUMBER:port4},%{NUMBER:port5},%{NUMBER:port6},%{NUMBER:port7},%{WORD:flow}" ]
    }

}
output {
  stdout {
        codec => rubydebug
  }
}