在logstash中使用数组过滤字段作为JSON

时间:2014-03-25 19:00:39

标签: java filter logback logstash logstash-logback-encoder

我开始使用logstash收集日志。当前设置包括使用logback作为日志记录机制的Java服务器和logstash-logback-encoder,以简洁的JSON表示形式输出数据。基础工作正常。

我想在单独的字段中以JSON格式分隔其他数据(因此JSON的每个键最终都在自己的字段中)。 logstash-logback-encoder提供了一种机制,可以在json_mesage字段中输出此类数据。但是,此JSON字符串将放入JSON数组中。请参阅此处格式化的样本以便更好地阅读。

{
"@timestamp":"2014-03-25T19:34:11.586+01:00",
"@version":1,
"message":"Message{\"activeSessions\":0}",
"logger_name":"metric.SessionMetrics",
"thread_name":"scheduler-2",
"level":"INFO",
"level_value":20000,
"HOSTNAME":"stage-01",
"json_message":["{\"activeSessions\":0}"],
"tags":[]
}

我尝试使用简单的JSON过滤器解析传入的JSON。看到我的配置:

input {
  lumberjack {
    <snipped>
    codec => "json"
  }
}
filter {
  json {
    source => "json_message"
  }
 }
 output {
   elasticsearch {
     <snipped>
   }
 }

但是,这会导致logstash日志中出现以下错误。无法处理数组中的JSON字符串。

{:timestamp=>"2014-03-25T19:43:13.232000+0100", 
 :message=>"Trouble parsing json", 
 :source=>"json_message", 
 :raw=>["{\"activeSessions\":0}"], 
 :exception=>#<TypeError: can't convert Array into String>, 
 :level=>:warn}

有没有办法在解析之前从数组中提取JSON字符串?任何帮助是极大的赞赏。感谢。

1 个答案:

答案 0 :(得分:4)

实际上,它非常简单,并且与通用编程语言一致。虽然,我没有在文档中找到答案。

只需在过滤器中的字段中添加索引:

filter {
  json {
    source => "json_message[0]"
  }
}