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