【问题标题】:Why is fluentd JSON parser not working properly?为什么流利的 JSON 解析器无法正常工作?
【发布时间】:2019-03-21 14:22:26
【问题描述】:

我正在使用图像 gcr.io/google-containers/fluentd-elasticsearch (v2.3.1) 以使 fluentd 收集一些日志并将它们发送到 Elastic 搜索。我正在为 fluentd 使用以下配置:

<source>
  type forward
  port {{.Values.fluentd.forward.port}}
  bind 0.0.0.0
</source>
<filter kube.**>
  @type parser
  @log_level debug
  key_name log
  reserve_data true
  remove_key_name_field true
  <parse>
    @type json
    time_key time
    time_type string
    time_format %iso8601
  </parse>
</filter>
<filter kube.**>
  @type record_transformer
  @log_level debug      
  enable_ruby
  <record>
    kubernetes ${record["kubernetes"]["cluster_name"] = "{{.Values.clusterName}}"; record["kubernetes"] }
    logtrail  {"host": "${record['kubernetes']['pod_name']}", "program":"${record['kubernetes']['container_name']}"}
  </record>
</filter>
<filter kube.**>
  @type concat
  key log
  stream_identity_key kubernetes["docker_id"]
  multiline_end_regexp /\n$/
  separator ""
</filter>

上面列出的配置应该解析与名为 log 的键关联的 JSON。但我看到 JSON 根本没有被解析。下面是我在 fluentd 进行过滤后得到的 JSON。我原以为会解析与密钥日志关联的 JSON。

{"kubernetes":{"pod_name":"api-dummy-dummy-vcpqr","namespace_name":"dummy","pod_id":"dummy","labels":{"name":"api-dummy","pod-template-hash":"dummy","tier":"dummy"},"host":"dummy","container_name":"api-dummy","docker_id":"dummy","cluster_name":"dummy Dev"},"log":"{\"name\":\"dummy\",\"json\":false,\"hostname\":\"api-dummy-dummy-vcpqr\",\"pid\":24,\"component\":\"dummy\",\"level\":30,\"version\":\"1.0\",\"timestamp\":1539645856126}","stream":"stdout","logtrail":{"host":"api-dummy-dummy-vcpqr","program":"api-dummy"}}

我已经花了超过 3 天的时间来解决这个问题。我什至尝试使用https://github.com/edsiper/fluent-plugin-docker,但这并没有帮助。尽管该插件有助于解析 JSON,但它导致解析的日志消息被我的 Elastic 搜索拒绝。

【问题讨论】:

  • 看我的回答here

标签: fluentd


【解决方案1】:

您的日志字段不是有效的 JSON。

{
  "kubernetes": {
    "pod_name": "api-dummy-dummy-vcpqr",
    "namespace_name": "dummy",
    "pod_id": "dummy",
    "labels": {
      "name": "api-dummy",
      "pod-template-hash": "dummy",
      "tier": "dummy"
    },
    "host": "dummy",
    "container_name": "api-dummy",
    "docker_id": "dummy",
    "cluster_name": "dummy Dev"
  },
  "log": "{\"name\":\"dummy\",\"json\":false,\"hostname\":\"api-dummy-dummy-vcpqr\",\"pid\":24,\"component\":\"dummy\",\"level\":30,\"version\":\"1.0\",\"timestamp\":1539645856126",
  "stream": "stdout",
  "logtrail": {
    "host": "api-dummy-dummy-vcpqr",
    "program": "api-dummy"
  }
}

您应该在解析为 JSON 之前连接日志字段。

【讨论】:

  • 抱歉,我已将日志字段更正为有效的字符串化 JSON..
  • 另外,在将日志字段解析为 JSON 之前连接它并没有帮助..它会导致连接插件出现 TimeoutError
  • 使用 timeout_label 参数处理 TimeoutError。
猜你喜欢
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
相关资源
最近更新 更多