【问题标题】:Filtering field with array as JSON in logstash在logstash中将数组过滤为JSON
【发布时间】:2014-03-25 19:00:39
【问题描述】:

我开始使用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 字符串?任何帮助是极大的赞赏。谢谢。

【问题讨论】:

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


    【解决方案1】:

    实际上,它非常简单,并且与常见的编程语言类似。不过,我没有在文档中找到答案。

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

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

    【讨论】:

    • 可以确认这在 Logstash 1.4.2 上不起作用。我正在尝试消除一个名为(即source =&gt; "message['item']")的数组,但是这可能是另一种情况。
    • @adam1616880 你试过在属性名称周围去掉单引号吗,我遇到了类似的问题,删除引号使以下 sn-p 工作add_field =&gt; { "request-id" =&gt; "%{contextMap[0][value]}" }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多