filebeat容器化采集docker日志推至logstash是最稳定轻量的生产方案。关键三步:确认日志路径(/var/lib/docker/containers/下*-json.log)、filebeat容器挂载该目录及docker.sock、配置filebeat.yml启用json解析并输出到logstash服务。

直接用 Filebeat 采集 Docker 容器日志并推给 Logstash,是最稳定、轻量且生产可用的方式。不需要改应用代码,也不依赖容器内日志驱动直连,关键是路径挂载、配置对齐、网络打通这三步。
确认 Docker 日志存储位置
Docker 默认使用 json-file 驱动,日志文件存在宿主机的 /var/lib/docker/containers/ 下,每个容器一个子目录,里面是 *-json.log 文件。这是 Filebeat 要读取的真实路径。
- 运行
docker info | grep "Docker Root Dir"确认根目录(通常就是/var/lib/docker) - 执行
ls /var/lib/docker/containers/*/ -1 | head -3看是否有-json.log文件生成 - 确保宿主机 SELinux 处于
permissive或已关闭(CentOS/RHEL 必须处理,否则挂载失败)
Filebeat 容器化部署并挂载日志目录
Filebeat 不要装在宿主机,而是用容器跑,挂载宿主机的 /var/lib/docker/containers 和 /var/run/docker.sock(可选,用于自动发现容器元数据)。
- 在
docker-compose.yml中定义 Filebeat 服务,添加 volumes:
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
-
ro表示只读,安全必须;docker.sock挂载后可在配置里用add_docker_metadata自动打上容器名、标签等字段
Filebeat 配置解析 JSON 日志并转发
写 filebeat.yml,核心是启用 JSON 解析、过滤空行、指定输出目标。
- 输入部分设为
type: filestream(替代已废弃的log类型),路径匹配所有容器日志:
- type: filestream
paths:
- /var/lib/docker/containers/*/*-json.log
json.keys_under_root: true
json.add_error_key: true
processors:
- drop_event.when.equals.json.message: ""
- 输出指向 Logstash(注意:用服务名
logstash,不是localhost):
hosts: ["logstash:5044"]
- 若需区分服务,可在 processors 里加
add_fields打标,例如:env: prod或app: user-service
Logstash 接收并结构化增强日志
Logstash 不负责采集,只做清洗和路由。它监听 5044 端口(beats 协议),收到后可补字段、转时间格式、分索引。
- 配置
logstash.conf的 pipeline:
filter {
# 把 @timestamp 字段从字符串转成 date 类型
date { match => ["time_local", "ISO8601"] target => "@timestamp" }
# 如果原始日志含 trace_id,提取后方便链路追踪
grok { match => { "message" => "%{GREEDYDATA}trace_id\":\"(?
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "docker-%{[container.name]}-%{+YYYY.MM.dd}"
}
}
- 注意:Logstash 容器必须与 Elasticsearch、Filebeat 在同一个自定义网络(如
elk网络),才能用服务名互通 - 索引名带
container.name可实现按服务隔离,避免混杂











