LogStash分解为key = value,逗号

时间:2018-11-23 12:43:03

标签: logstash logstash-grok logstash-configuration

我有一种包含性能和统计数据的日志模式。我已配置LogStash将此数据分解为csv格式,以便将值保存到ES。

<1>,www1,3,BISTATS,SCAN,330,712.6,2035,17.3,221.4,656.3

我正在使用以下LogSTash过滤器并获得所需的结果。

grok {
  match => { "Message" => "\A<%{POSINT:priority}>,%{DATA:pan_host},%{DATA:pan_serial_number},%{DATA:pan_type},%{GREEDYDATA:message}\z" }
  overwrite => [ "Message" ]
}
csv {
  separator => ","
  columns => ["pan_scan","pf01","pf02","pf03","kk04","uy05","xd06"]
}

只要列的顺序不会弄乱,这对我来说目前效果很好。

但是,我想使此日志文件更有意义,并在原始日志中具有每个列名。示例-<1>,www1,30000,BISTATS,SCAN,pf01=330,pf02=712.6,pf03=2035,kk04=17.3,uy05=221.4,xd06=656.3

这样,我可以在过程中间不断插入或附加键/值,而不会破坏数据。 (使用LogStash5.3)

1 个答案:

答案 0 :(得分:0)

通过使用@baudsp建议,我可以制定以下内容。我完全删除了csv{}块,并将其替换为kv{}块。 kv{}自动创建了所有键值,只剩下mutate{}个字段变为浮点数和整数。

 json {
  source => "message"
  remove_field => [ "message", "headers" ]
 }
 date {
   match => [ "timestamp", "YYYY-MM-dd'T'HH:mm:ss.SSS'Z'" ]
   target => "timestamp"
 }
 grok {
   match => { "Message" => "\A<%{POSINT:priority}>,%{DATA:pan_host},%{DATA:pan_serial_number},%{DATA:pan_type},%{GREEDYDATA:message}\z" }
   overwrite => [ "Message" ]
 }
 kv {
  allow_duplicate_values => false
  field_split_pattern => ","
 }

使用上面的代码块,我可以在消息中的任意位置插入K = V对。再次感谢您提供的所有帮助。我为尝试完成此任务的任何人添加了一个示例代码块。

注意:我正在使用NLog进行日志记录,该日志生成JSON输出。在C#代码中,格式如下所示。

var logger = NLog.LogManager.GetCurrentClassLogger();
logger.ExtendedInfo("<1>,www1,30000,BISTATS,SCAN,pf01=330,pf02=712.6,pf03=2035,kk04=17.3,uy05=221.4,xd06=656.3");