如何使用fluentd转发多行docker日志?

时间:2019-09-11 20:42:18

标签: logging fluentd

以下是我的配置,用于从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日志添加多行解析器?

2 个答案:

答案 0 :(得分:1)

实际上,为解决此问题,我要做的是将接收到的数据(从<source>类型写入文件(使用<match>类型的文件),然后读取文件(使用{{ 1}}输入tail),此时我可以使用多行解析器。原始来源(例如主机名,环境名称等)的元数据必须存储在文件名中,然后使用标签部件将其提取出来。

示例:

Docker守护程序运行时具有以下选项:

<source>

有效的配置如下:

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

顺便说一句,您还可以使用Docker守护程序选项,将Docker标签中的值包含在传递给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>

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

答案 1 :(得分:0)

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

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

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

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

androidx.fragment.app.FragmentContainerView