Filebeat以DaemonSet形式部署于每个节点,自动采集容器日志并注入Pod元数据,支持JSON解析与低资源占用,结合Elasticsearch索引管理和Kibana多维查询实现可查可用的日志体系。

容器编排环境(如 Kubernetes 或 Docker Swarm)中,日志天然分散在多个节点、多个 Pod/容器中,且生命周期短暂。直接依赖 docker logs 或本地 JSON 文件无法满足长期归档、结构化分析和审计合规需求。ELK(Elasticsearch + Logstash + Kibana)或更轻量的 EFK(Elasticsearch + Filebeat + Kibana)是主流落地方案,关键在于采集层如何适配编排系统的动态性。
Filebeat 作为 DaemonSet 部署到每个节点
这是生产中最常用、最稳定的方式。Filebeat 以 DaemonSet 形式运行在每个工作节点上,自动发现本机所有容器的日志文件(默认路径 /var/lib/docker/containers/*/*.log 或 Kubernetes 的 /var/log/pods/),无需修改应用容器配置。
- 自动识别容器元数据(如 Pod 名、命名空间、标签),并注入日志字段,例如:
pod_name、namespace、kubernetes.labels.app - 支持 JSON 解析:若容器日志为标准 JSON 格式(如 Go 应用用
log.JSON()输出),Filebeat 可自动展开字段,避免后续 Logstash 再解析 - 资源占用低(通常 harvester 实时读取文件尾部,不漏日志
Logstash 做集中清洗与路由
Filebeat 将原始日志发往 Logstash(而非直连 Elasticsearch),便于统一做字段增强、敏感信息脱敏、多租户隔离和索引分片策略。
- 按业务线或环境打标:例如用
mutate插件添加env: "prod"或team: "payment" - 错误日志单独路由:用
if [log.level] == "ERROR"规则将错误日志写入专用索引(如errors-*),方便告警联动 - 时间字段标准化:Docker 日志中的
@timestamp是采集时间,需用date过滤器从日志内容提取真实业务时间(如"time":"2026-06-13T10:22:15Z")
Elasticsearch 索引生命周期管理(ILM)
容器日志量大且增长快,必须启用 ILM 自动归档与清理,否则集群易因磁盘爆满而不可用。
- 定义策略:例如保留最近 30 天热数据(SSD 存储)、自动转入 warm 阶段(HDD 存储)保留 90 天、最后 delete
- 按天创建索引:Logstash 输出配置中设
index => "docker-logs-%{+YYYY.MM.dd}",再绑定 ILM 策略 - 禁止直接写入
docker-logs-*通配索引,改用别名(如docker-logs-write)指向最新索引,确保写入稳定性
Kibana 中实现多维关联查询
归档不是目的,可查可用才是核心。Kibana 可基于容器元数据快速构建上下文视图。
- 用 Discover 按
pod_name+container_name筛选单实例全链路日志 - 用 Lens 图表统计各命名空间的 ERROR 数量趋势,定位异常服务
- 保存常用查询为 Saved Search,共享给运维/开发团队,例如 “过去 1 小时内所有 5xx 响应”

















