如何配置Fluent Bit实现K8S日志分流向Elasticsearch与Syslog输出?
Fluent Bit 配置方案
要实现你的需求,核心是通过过滤器分流+复制日志流完成双重转发,以下是具体配置步骤:
1. 输入配置(Kubernetes 日志采集)
先配置 Kubernetes 日志输入,这里以官方 kubernetes 插件为例,自动采集容器日志并解析结构化数据:
[INPUT] Name kubernetes Tag k8s.raw Kube_Tag_Prefix k8s.var.log.containers. Merge_Log On # 将容器日志合并到结构化字段中 Merge_Log_Key log_content # 合并后的日志内容字段名 K8S-Logging.Parser On # 启用 K8S 日志自动解析 K8S-Logging.Exclude Off # 不排除标记了 K8S-Logging: false 的日志
2. 过滤器配置(分流与筛选)
第一步:筛选含 syslog 字符串的日志
用 grep 过滤器过滤出所有包含 syslog 字符串的日志(这里假设检查的是合并后的 log_content 字段,可根据实际字段调整):
[FILTER] Name grep Match k8s.raw Regex log_content syslog # 匹配字段中包含 syslog 字符串的日志
第二步:复制日志流
用 copy 过滤器将筛选后的日志复制成两个流,分别用于转发到 Elasticsearch 和额外的 Syslog 输出:
[FILTER] Name copy Match k8s.raw Name stream_es # 用于 Elasticsearch 的流 Name stream_syslog_check # 用于检查是否需要转发到 Syslog 的流
第三步:筛选含 syslog: true 的日志
对 stream_syslog_check 流再用 grep 过滤器,只保留 syslog 字段值为 true 的日志:
[FILTER] Name grep Match stream_syslog_check Regex syslog true # 匹配结构化字段 syslog 等于 true 的日志
3. 输出配置
转发到 Elasticsearch
将 stream_es 和 stream_syslog_check 两个流的日志都发送到 Elasticsearch(因为 syslog: true 的日志也要同步到 ES):
[OUTPUT] Name es Match stream_es stream_syslog_check Host your-es-host.example.com # 替换为你的 ES 地址 Port 9200 Index k8s-syslog-logs-%Y.%m.%d # 按日期分索引 Logstash_Format On Retry_Limit False # 不限制重试次数
额外转发到 Syslog 插件
将筛选后的 stream_syslog_check 流日志发送到指定的 Syslog 服务器:
[OUTPUT] Name syslog Match stream_syslog_check Host your-syslog-host.example.com # 替换为你的 Syslog 地址 Port 514 Mode tcp # 可选 udp,根据你的 Syslog 服务器配置 Syslog_Format rfc5424 Syslog_Hostname k8s-cluster Syslog_AppName fluent-bit Syslog_Message_Key log_content # 指定作为 Syslog 消息内容的字段
关键说明
- 如果你的日志中
syslog字符串不在log_content字段,可调整grep过滤器的Regex参数,比如要匹配任意字段中的syslog,可以写Regex .* syslog。 - 若使用
tail插件采集日志(而非kubernetes插件),只需调整INPUT部分的配置,过滤器和输出逻辑保持一致。 - 注意过滤器的匹配顺序:先筛选含
syslog字符串的日志,再复制流,最后筛选syslog: true的日志,避免无意义的日志流转。
内容的提问来源于stack exchange,提问作者Raz Maabari
相关产品推荐
相关产品推荐

