Java 在logstash中将数组作为JSON筛选字段

Java 在logstash中将数组作为JSON筛选字段,java,filter,logback,logstash,logstash-logback-encoder,Java,Filter,Logback,Logstash,Logstash Logback Encoder,我开始用logstash收集日志。当前设置包括使用logback作为日志机制的Java服务器和logstash logback编码器,以整洁的JSON表示输出数据。基本的工作很好 我想将JSON格式的附加数据分离到单独的字段中(这样JSON的每个键都会在自己的字段中结束)logstash logback encoder提供了一种机制,用于在json_mesage字段中输出此类数据。但是,此JSON字符串被放入JSON数组中。为了更好地阅读,请参阅这里的一个格式化示例 { "@timestamp"

我开始用
logstash
收集日志。当前设置包括使用
logback
作为日志机制的Java服务器和
logstash logback编码器,以整洁的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>
   }
 }
输入{
伐木工人{
编解码器=>“json”
}
}
滤器{
json{
source=>“json_消息”
}
}
输出{
弹性搜索{
}
}
但是,这会导致日志存储日志中出现以下错误。数组中的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}
{:timestamp=>“2014-03-25T19:43:13.232000+0100”,
:message=>“解析json时遇到问题”,
:source=>“json_消息”,
:raw=>[“{\”activeSessions\“:0}”],

:exception=>#事实上,它非常简单,并且按照常见编程语言的思路进行操作。不过,我在文档中没有找到答案

只需向筛选器中的字段添加索引:

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

可以确认这在Logstash 1.4.2上不起作用。我正在尝试消除一个名为(即
source=>“message['item']”的数组但是,情况可能不同。@adam1616880您是否尝试过删除属性名称周围的单引号,我遇到了类似的问题,删除引号使以下代码段正常工作
add_field=>{“request id”=>“%{contextMap[0][value]}