【问题标题】:How to forward multiline docker logs using fluentd?如何使用 fluentd 转发多行 docker 日志?
【发布时间】:2019-09-11 20:42:18
【问题描述】:

以下是我从fluent.conf转发docker日志的配置,我想添加多行解析。

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

Fluentd 有一个多行解析器,但它只支持in_tail 插件。我尝试使用in_tail 插件添加多行解析器,它可以工作,但我无法将它添加到 docker 日志中。

<parse>
    @type multiline
    format_firstline /\d{4}-\d{1,2}-\d{1,2}/
    format1 /^(?<logtime>\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}.\d{1,9}) \[(?<thread>.*?)]\ (?<level>[^\s]+)(?<log>.*)/
  </parse>

如何在 fluentd 上使用 forward 插件为 docker 日志添加多行解析器?

【问题讨论】:

标签: logging fluentd


【解决方案1】:

实际上,我解决这个问题的方法是将接收到的数据(从&lt;source&gt; 类型转发)写入文件(&lt;match&gt; 类型文件),然后读取文件(&lt;source&gt; 类型尾部) ,此时我可以使用多行解析器。来自原始源的元数据(例如主机名、环境名称等)必须存储在文件名中,然后使用标记部分提取出来。

例子:

Docker 守护程序使用以下选项运行:

--log-driver=fluentd --log-opt tag=ecs.{{.ImageName}}

Fluentd 配置如下:

<source>
  @type forward
  port 24224
</source>

<match ecs.**>
  @type forest
  subtype file
  <template>
    time_slice_format %Y-%m-%d
    path /var/log/td-agent/ecs/${tag}.*.log
    format single_value
    message_key log
    append true
  </template>
</match>

<source>
  type tail
  format multiline
  format_firstline /\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}/
  format1 /(?<time>\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}([,.]\d{1,4})*\S*)\s+(?<level>\w+)\s+\[(?<thread>.*?)\s*\]\s+(?<message>.+)/
  path /var/log/td-agent/ecs/ecs.*.java.*.log
  multiline_flush_interval 2s
  pos_file /var/log/td-agent/ecs/java-1.pos
  tag java.log-1.*
  refresh_interval 5
</source>

<match java.**>
  type elasticsearch
  host es-host
  port 9200
  index_name java
  logstash_format true
  logstash_prefix java
</match>

顺便说一句,您还可以在传递给 fluentd 的标记中包含来自 Docker 标签的值,使用 Docker 守护程序选项如下:

--log-opt tag='ecs.{{.ContainerLabels.ENVIRONMENT}}.{{.ContainerLabels.LOG_TYPE}}.{{.ContainerLabels.ARTIFACT_ID}}.{{.ContainerLabels.ARTIFACT_VERSION}}.{{index .ContainerLabels \\\"spinnaker.servergroup\\\"}}'

在上面的示例中,我为传递给 fluentd 的标签添加了 4 个标签,然后可以将其提取到字段中并传递给 Elasticsearch。

【讨论】:

    【解决方案2】:

    如果您只需要连接异常日志消息,则可以使用 fluent-plugin-concatfluent-plugin-detect-exceptions

    用于处理源自 Docker 驱动程序的多行的 Fluentd 文档是:here

    我还发现以下链接很有用:

    最后,以下是我在我的案例中使用的配置:

    <source>
      @type forward
      port 24224
      bind 0.0.0.0
      tag removeme.docker
    </source>
    
    <match removeme.docker.**>
      @type detect_exceptions
      message log
      remove_tag_prefix removeme
      languages java, python
      multiline_flush_interval 1
    </match>
    
    <match docker.**>
      @type copy
      <store>
        @type elasticsearch
        host elasticsearch-1
        port 9200
        logstash_format true
        logstash_prefix fluentd
        logstash_dateformat %Y%m%d
        include_tag_key true
        type_name access_log
        tag_key @log_name
        flush_interval 1s
      </store>
      <store>
        @type stdout
      </store>
    </match>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-03
      • 2015-12-17
      • 2021-09-16
      • 1970-01-01
      • 2016-06-17
      • 2020-01-18
      • 2019-10-20
      • 1970-01-01
      相关资源
      最近更新 更多