You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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:
    [FILTER]
        Name rewrite_tag
        Match docker.raw
        Rule $log_path ^\/var\/lib\/docker\/containers\/([^\/]+)\/.*$ docker.$1 true
    
    处理后日志Tag会变为docker.<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:42:19