【问题标题】:fluentd nested json parsing流利的嵌套json解析
【发布时间】:2019-09-26 16:29:39
【问题描述】:

我有如下日志:

{
  "log": {
    "header": {
      "key": "value",
      "nested": "{\"key1\":\"value\",\"key2\":\"value\"}",
      "dateTime": "2019-05-08T20:58:06+00:00"
    },
    "body": {
      "path": "/request/path/",
      "method": "POST",
      "ua": "curl/7.54.0",
      "resp": 200
    }
  }
}

我正在尝试使用 fluentd 聚合日志,并且我希望整个记录都是 JSON。具体问题是“$.log.header.nested”字段,它是一个 JSON 字符串。如何解析并用其内容替换该字符串?

为了清楚起见,我希望 fluentd 输出的日志如下所示:

{
  "log": {
    "header": {
      "key": "value",
      "nested": {
          "key1": "value",
          "key2": "value"
      },
      "dateTime": "2019-05-08T20:58:06+00:00"
    },
    "body": {
      "path": "/request/path/",
      "method": "POST",
      "ua": "curl/7.54.0",
      "resp": 200
    }
  }
}

我找到了一种将嵌套字段解析为 JSON 的方法,但存储到解析它的同一个键并不清楚。 hash_value_field 似乎不支持存储到嵌套键。有没有其他方法可以做到这一点?

【问题讨论】:

  • 要保留原来的key和value吗?
  • 我想把这个值解析成一个合适的对象/哈希值,然后用解析后的值替换原来的值。

标签: json fluentd


【解决方案1】:

以下配置似乎完成了我想要的。但是,我不确定这是否是最好的方法。我认为使用 ruby​​ 的性能要差得多。欢迎对此进行任何改进。

<filter logs>
  @type parser
  key_name "$.log.header.nested"
  hash_value_field "parsed_nested"
  reserve_data true
  remove_key_name_field true
  <parse>
    @type json
  </parse>
</filter>

<filter logs>
  @type record_transformer
  enable_ruby true
  <record>
    parsed_nested ${record["log"]["header"]["nested"] = record["parsed_nested"]}
  </record>
  remove_keys parsed_nested
</filter>

【讨论】:

    猜你喜欢
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    相关资源
    最近更新 更多