首页 > 解决方案 > Fluentd 消息解析以发送到多个目的地

问题描述

我们有如下消息。

{"message":"[{\"date\":1630060740.621981,\"log\":\"tenant 1 testing 10\",\"filename\":\"/var/log/input/tenant1/file1.log\",\"tenantid\":\"tenant1\"}]"}
{"message":"[{\"date\":1630060740.621981,\"log\":\"tenant 2 testing 10\",\"filename\":\"/var/log/input/tenant2/file1.log\",\"tenantid\":\"tenant2\"}]"}

根据租户 ID,我们希望将日志发送到不同的目的地。我们尝试使用解析器插件将内部字符串化的 JSON 解析为实际的 JSON,然后使用重写标签过滤器根据租户 ID 进行标记,最终对不同的标签使用不同的匹配。配置看起来像这样。

<filter *>
  @type parser
  key_name message
  reserve_time true
  <parse>
    @type json
  </parse>
</filter>

<match something>
  @type rewrite_tag_filter

  <rule>
    key tenantid
    pattern /tenant1/
    tag ${tag}.a
  </rule>

  <rule>
    key tenantid
    pattern /tenant2/
    tag ${tag}.b
  </rule>

</match>

<match something.a>
    @type http

    endpoint xyz
    open_timeout 2

    <auth>
    method basic
    username abcd
    password abcd
    </auth>

    <format>
      @type json
    </format>

    <buffer>
      flush_interval 10s
    </buffer>

</match>

<match something.b>
    @type http

    endpoint abc
    open_timeout 2

    <auth>
    method basic
    username efgh
    password efgh
    </auth>

    <format>
      @type json
    </format>

    <buffer>
      flush_interval 10s
    </buffer>

</match>

但这不起作用,可能是因为我们将 JSON 数组作为message. 有没有办法做到这一点?

基本上,解析器插件在 JSON 中制作记录,如下所示。

[{"date":1630060200.145695,"tenantid":"tenant1","filename":"/var/log/input/tenant1/file1.log","log":"tenant 1 testing 8"}]

这包含一个[]我们无法在 rewrite_tag_filter 中正确解析的额外内容。有没有办法从 JSON 数组中获取 JSON 对象?解析应该包含类似下面的内容,以便 rewrite_tag_filter 工作。{"date":1630060200.145695,"tenantid":"tenant1","filename":"/var/log/input/tenant1/file1.log","log":"tenant 1 testing 8"}

标签: fluentd

解决方案


推荐阅读