Docker 应用如何用 Filebeat + Logstash 收集日志?
Docker 应用日志收集方案:应用写 stdout → json-file 落盘 /var/lib/docker/containers → Filebeat 采集 → Logstash 清洗 → ES。本文给出挂载要点与 autodiscover 配置。
标准链路:容器日志写 stdout/stderr(Docker json-file 驱动落盘)→ Filebeat 挂宿主机的 /var/lib/docker/containers 目录采集 → 送 Logstash 解析 → 入 ES。容器内不要自己写日志文件。
关键配置
应用侧:日志输出到 stdout(12-Factor 原则),Docker 默认 json-file 驱动落盘。
Filebeat(宿主机或容器均可,推荐宿主机 DaemonSet):
filebeat.autodiscover:
providers:
- type: docker
hints.enabled: true # 支持容器 labels 声明日志类型
processors:
- add_docker_metadata: ~ # 附加容器名/镜像/标签
Logstash 侧:按容器标签(如 co.elastic.logs/multiline.*)做多行合并与 grok 解析。
注意事项
- 挂载只读:
-v /var/lib/docker/containers:/var/lib/docker/containers:ro,并挂载 docker.sock 供元数据查询; - json-file 驱动要配轮转:
--log-opt max-size=10m --log-opt max-file=3; - K8s 环境同理,路径为 /var/log/containers。
观测云对照
观测云 DataKit 一条 DaemonSet YAML 即完成容器 stdout/stderr 全量采集,自动附加 K8s 元数据,Pipeline 在线完成清洗——无需维护 Filebeat+Logstash 双层。
常见问题(FAQ)
Q:应用已经写日志文件了怎么办? 挂卷到宿主机,Filebeat 按文件路径采集。
Q:多行堆栈怎么处理? Filebeat multiline 或 Logstash multiline codec,按日期行首合并。