在 FluentD 中解析内部 JSON

Posted

技术标签:

【中文标题】在 FluentD 中解析内部 JSON【英文标题】:Parsing inner JSON inside FluentD 【发布时间】:2017-06-18 20:52:41 【问题描述】:

我通过 FluentD 驱动程序从 docker 容器发出了一些 JSON,例如:

'"timeMillis":1485917543709,"thread":"main","level":"INFO","loggerName":"com.imageintelligence.ava.api.Boot","message":"\"dom\":\"DOM\"","loggerFqcn":"org.apache.logging.slf4j.Log4jLogger","threadId":1,"threadPriority":5'

注意message 字段是字符串编码的JSON?当 fluentD 捕获这些数据时,它最终看起来像这样,正如预期的那样:

2017-02-01 06:29:15 +0000 docker.6faad650faa6: "log":"\"timeMillis\":1485917543709,\"thread\":\"main\",\"level\":\"INFO\",\"loggerName\":\"com.imageintelligence.ava.api.Boot\",\"message\":\"\\\"dom\\\":\\\"DOM\\\"\",\"loggerFqcn\":\"org.apache.logging.slf4j.Log4jLogger\",\"threadId\":1,\"threadPriority\":5\r","com.amazonaws.ecs.cluster":"dombou","container_id":"6faad650faa6012af4f32df79901b42488543a5e6e53517fe3579b01ab2b6862","container_name":"/upbeat_booth","source":"stdout"`

我使用这样的过滤器来解析 JSON:

<filter docker.**>
  @type parser
  format json
  key_name log
  reserve_data true
  hash_value_field log
</filter>

我最终得到了半消毒的 JSON:

2017-02-01 06:32:10 +0000 docker.68c794f7f694: "source":"stdout","log":"timeMillis":1485917543709,"thread":"main","level":"INFO","loggerName":"com.imageintelligence.ava.api.Boot","message":"\"dom\":\"DOM\"","loggerFqcn":"org.apache.logging.slf4j.Log4jLogger","threadId":1,"threadPriority":5,"com.amazonaws.ecs.cluster":"dombou","container_id":"68c794f7f6948d4261b9497947834651abbf766e9aa51a76f39d6895b7a9ac18","container_name":"/sad_hamilton"

问题是,message 字段仍然是字符串转义的 JSON 字段。关于如何解析该内部 JSON 字段的任何建议?如何堆叠过滤器?

【问题讨论】:

【参考方案1】:

您可以尝试顺序过滤器:

<filter docker.**>
  @type parser
  key_name log
  format json
  reserve_data true
</filter>

<filter docker.*.embeded_json.**>
  @type parser
  key_name message
  format json
  reserve_data true
</filter>

【讨论】:

你是我的救星! @rhunwicks,我没用。顺序过滤器是否仍然有效?【参考方案2】:

请尝试以下插件,让我知道它是怎么回事:

https://github.com/edsiper/fluent-plugin-docker

【讨论】:

我的理解是这适用于“日志”字段,但在日志字段内没有任何内容。我需要一些可以递归处理日志内部的东西。不过我会试一试的 确认:它没有按照我的意愿解析内部 json 对我也不起作用。所以即使在 2020 年我们也没有办法解析内部 json?【参考方案3】:

定义一个过滤器并使用 json_in_json 插件来实现 fluentd。在此过滤器之后,为此过滤器定义匹配器以对您的日志进行进一步处理。

这可以帮助您解析嵌套的 json。你可能还需要添加 gem install fluent-plugin-json-in-json,如果它不存在的话。 参考 - https://github.com/gmr/fluent-plugin-json-in-json

【讨论】:

以上是关于在 FluentD 中解析内部 JSON的主要内容,如果未能解决你的问题,请参考以下文章

在fluentd中如何解析日志并根据键值创建字段

4.安装fluentd用于收集集群内部应用日志

fluentd解析日志部分json

fluentd 解析httpd日志

使用 fluentd 收集数据时的毫秒数

IETF syslog 输入到 fluentd