如何使用Fluent-bit按容器名称分类Docker容器日志?
用Fluent-bit处理Docker容器日志:获取Container ID并映射为容器名称
一、从日志路径提取Container ID
用Tail插件监听/var/lib/docker/containers/*/*.log时,可通过Fluent-bit的内置能力直接提取container_id:
- 先在Tail输入配置里开启
Path_Key,让每条日志带上完整的日志路径字段:[INPUT] Name tail Path /var/lib/docker/containers/*/*.log Tag docker.raw Path_Key log_path - 再用
Rewrite Tag Filter从路径中匹配出container_id,并重写日志Tag:
处理后日志Tag会变为[FILTER] Name rewrite_tag Match docker.raw Rule $log_path ^\/var\/lib\/docker\/containers\/([^\/]+)\/.*$ docker.$1 truedocker.<container_id>,其中<container_id>就是从路径中提取的容器ID。
二、将Container ID映射为容器名称
有两种常用方式实现ID到名称的映射:
方法1:使用官方Docker Filter插件
这个插件可以直接调用Docker API拉取容器元数据,自动把container_id对应到容器名称:
[FILTER] Name docker Match docker.* Merge_Log On Keep_Log Off Match_Container_Id ${TAG_PARTS[1]}
Match_Container_Id ${TAG_PARTS[1]}会从Tag的第二部分(即之前提取的container_id)匹配对应容器,然后将容器名称以container_name字段添加到日志中。- 注意:如果是容器化部署Fluent-bit,需要挂载
/var/run/docker.sock到容器内,确保能访问Docker API。
方法2:自定义Lua脚本查询Docker API
如果需要更灵活的逻辑,可以用Lua脚本调用Docker的容器信息接口:
function filter(tag, timestamp, record) local container_id = tag:match("docker%.(.*)") local http = require("socket.http") local json = require("cjson") local url = "http://unix:/var/run/docker.sock:/containers/" .. container_id .. "/json" local response, status = http.request(url) if status == 200 then local container_info = json.decode(response) record["container_name"] = container_info.Name:sub(2) -- 去掉名称开头的/ return 2, timestamp, record end return 0, timestamp, record end
然后在Fluent-bit配置中加载这个过滤器:
[FILTER] Name lua Match docker.* script /path/to/your/script.lua call filter
三、按容器名称应用不同过滤器
拿到container_name字段后,就可以通过条件匹配对不同容器日志做差异化处理:
示例1:直接用Condition区分处理
# 给my-app容器的日志做JSON解析 [FILTER] Name parser Match docker.* Condition container_name ^my-app$ Parser json Key_Name log # 过滤db容器日志中的error条目 [FILTER] Name grep Match docker.* Condition container_name ^db$ Exclude log error
示例2:重写Tag后分别处理
先把不同容器的日志分到独立Tag,再针对性配置过滤器:
[FILTER] Name rewrite_tag Match docker.* Rule $container_name ^my-app$ docker.my-app true Rule $container_name ^db$ docker.db true # 处理my-app的日志 [FILTER] Name parser Match docker.my-app Parser json # 处理db的日志 [FILTER] Name grep Match docker.db Exclude log error
内容的提问来源于stack exchange,提问作者user2706071
相关产品推荐
相关产品推荐

