我正在使用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对象中放置一个默认值。我怎么能这样做?
答案 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
}
}