Logstash 使用Losgtash解析日志

Logstash 使用Losgtash解析日志,logstash,logstash-grok,logstash-configuration,Logstash,Logstash Grok,Logstash Configuration,我正在使用Logstash解析日志文件。下面显示了一个日志行示例 2011/08/10 09:51:34.450457,1.048908,tcp,213.200.244.21747908,->,147.32.84.596881,S_RA,0,0,4244124,流量=背景建立的cmpgw CVUT 我在配置文件中使用以下过滤器 grok { match => ["message","%{DATESTAMP:timestamp},%{BASE16FLOAT:value},%{

我正在使用Logstash解析日志文件。下面显示了一个日志行示例

2011/08/10 09:51:34.450457,1.048908,tcp,213.200.244.21747908,->,147.32.84.596881,S_RA,0,0,4244124,流量=背景建立的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.21747908,->,147.32.84.596881,S_RA,0,0,4244124,流量=背景已建立的cmpgw CVUT

如果缺少一个值,我想在输出Json对象中放一个默认值。我如何才能做到这一点?

对第二个字段使用
({BASE16FLOAT:value})?
使其成为可选字段-即regex
()?

即使第二个字段为空,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}

在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
  }
}

如果您想在空值字段的情况下得到一些固定的响应,请让我知道,我也会插入该配置。不过这给出了一个例外。但非常感谢您的帮助。请分享您的异常消息。