在 fluentd 中使用具有不同匹配类型的单个源

Posted

技术标签:

【中文标题】在 fluentd 中使用具有不同匹配类型的单个源【英文标题】:Using a single source in fluentd with different match types 【发布时间】:2020-08-04 12:18:14 【问题描述】:

所以我试图从运行在主机上的 docker 容器捕获输出,但是在开发人员更改为使用 json 作为容器的日志输出之后,我错过了容器启动消息中发生的入口点.sh。我可以看到有人在配置文件中添加了一个新的过滤器部分,它可以很好地捕获 json 输出,但只能捕获 json 输出。

这里是使用的模板:

<source>
  @type forward
  port 24224
  bind 0.0.0.0
  tag GELF_TAG
</source>

<filter GELF_TAG.**>
  @type parser
  key_name log
  reserve_data false
  <parse>
    @type json
  </parse>
</filter>

<match GELF_TAG.**>
  @type copy
  <store>
    @type gelf
    host  graylog_server_fqdn 
    port 12201
    protocol tcp
    flush_interval 5s
  </store>
  <store>
    @type stdout
  </store>
</match>

如何设置配置以在容器启动后捕获 entrypoint.sh 输出和 json 输出?

编辑。

过滤器拒绝发送到 docker 容器标准输出的消息,直到应用程序开始登录 json。

[warn]: #0 dump an error event: error_class=Fluent::Plugin::Parser::ParserError error="pattern not matched with data

所以我试图捕捉到 ERROR 标记中的所有内容,我可以看到丢失的消息,但它们仍然无法使用此配置进行解析:

# Ansible
<source>
  @type forward
  port 24224
  bind 0.0.0.0
  tag GELF_TAG
</source>

<filter GELF_TAG.**>
  @type parser
  emit_invalid_record_to_error true
  key_name log
  reserve_data false
  <parse>
    @type json
  </parse>
</filter>

<match GELF_TAG.**,@ERROR>
  @type copy
  <store>
    @type gelf
    host  graylog_server_fqdn 
    port 12201
    protocol tcp
    flush_interval 5s
  </store>
  <store>
    @type stdout
  </store>
</match>

【问题讨论】:

所以,过滤器拒绝非 JSON 日志,对吧? 检查emit_invalid_record_to_error。可能会有所帮助。 所以我想我会试一试,我现在看到所有丢失的数据都被转储在 ERROR 标记中,但解析器仍然失败。 数据在那里,问题是非JSON数据无法解析为JSON。能否添加另一个源来解析非 JSON 日志? 数据都来自端口 24224 上的单一来源。所以我不确定这会有所帮助。 【参考方案1】:

安装多格式解析器:

td-agent-gem install fluent-plugin-multi-format-parser -v 1.0.0

# Ansible
<source>
  @type forward
  port 24224
  bind 0.0.0.0
  tag GELF_TAG
</source>

<filter GELF_TAG.**>
  @type parser
  key_name log
  reserve_data false
  <parse>
    @type multi_format
    <pattern>
      format json
      time_key timestamp
    </pattern>
    <pattern>
      format none
    </pattern>
  </parse>
</filter>

<match GELF_TAG.**>
  @type copy
  <store>
    @type gelf
    host  graylog_server_fqdn 
    port 12201
    protocol tcp
    flush_interval 5s
  </store>
  <store>
    @type stdout
  </store>
</match>

【讨论】:

【参考方案2】:

您还可以使用输出插件“rewrite_tag_filter”。使用它,您可以更改不同模式的标签,然后使用解析器/过滤器。

【讨论】:

以上是关于在 fluentd 中使用具有不同匹配类型的单个源的主要内容,如果未能解决你的问题,请参考以下文章

Fluentd初探 简介与安装

Fluentd 日志源格式 RegEX

对于具有不同类型控件的单个视图,我是不是需要多个控制器?

fluentd:多个过滤器和匹配项的一个来源

拖尾 json 文件时 fluentd 中的模式不匹配错误

如何从具有不同参数的单个端点获得多个响应?