Filebeat+Logstash+ELK 是生产常用日志方案,Filebeat 采集日志,Logstash 解析过滤,Elasticsearch 存储,Kibana 可视化;需校验权限、端口、索引模式及时区,建议启用队列与告警提升稳定性。

Filebeat + Logstash + ELK(Elasticsearch + Kibana)是生产环境中最常用的日志收集与分析方案之一。它轻量、可扩展、支持结构化处理,适合从服务器、应用、容器等多源采集日志并统一可视化分析。
一、明确各组件角色与数据流向
理解分工是搭建前提:
- Filebeat:轻量级日志采集器,部署在日志产生端(如 Web 服务器),负责读取文件、监控新增内容、发送至 Logstash 或直连 Elasticsearch
- Logstash:日志“加工中心”,接收 Filebeat 数据,做解析(如 grok 提取字段)、过滤(丢弃调试日志)、丰富(添加 host、环境标签)后转发
- Elasticsearch:分布式 搜索引擎,存储结构化日志,支撑快速检索与聚合
- Kibana:前端 可视化平台,通过索引模式关联 ES 数据,构建仪表板、告警、发现页
典型流程:Filebeat → Logstash → Elasticsearch → Kibana
二、快速部署关键配置(以 Nginx 访问日志为例)
假设目标:采集/var/log/nginx/access.log,提取 status、response_time、uri 等字段,在 Kibana 中按状态码统计请求量。
1. Filebeat 配置(/etc/filebeat/filebeat.yml)
filebeat.inputs: - type: filestream enabled: true paths: - /var/log/nginx/access.log fields: app: nginx env: prod output.logstash: hosts: ["localhost:5044"]
2. Logstash 配置(/etc/logstash/conf.d/nginx-pipeline.conf)
input {beats { port => 5044 } } filter {if [fields][app] == "nginx" {grok { match => {"message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} [%{HTTPDATE:timestamp}]"%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}"%{NUMBER:status} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent}"%{NUMBER:response_time}""} } mutate {convert => {"status"=>"integer"} convert => {"response_time"=>"float"} } } }
output {elasticsearch { hosts => ["https://www.php.cn/link/fb7850115a917d3ab720269da3e667de"] index =>"nginx-access-%{+YYYY.MM.dd}" } }
注意:确保 Logstash 有对应 grok pattern(如 IPORHOST、HTTPDATE),可用dissect 替代复杂 grok 提升性能;时间戳需用 @timestamp 字段对齐 ES 时序能力。
三、验证与排错要点
常见问题不是配置写错,而是权限、路径、网络或时区没对齐:
- Filebeat 无法读日志?检查
filebeat用户是否有/var/log/nginx/目录及文件读取权限(ls -l /var/log/nginx/access.log) - Logstash 收不到数据?确认
systemctl status logstash运行正常,并用telnet localhost 5044测试 端口 连通性 - ES 里没数据?查看 Logstash 日志(
/var/log/logstash/logstash-plain.log),搜索error或pipeline关键字;同时确认 ES 是否健康(curl -X GET "localhost:9200/_cluster/health?pretty") - Kibana 看不到新索引?进入
Stack Management → Index Patterns,创建匹配nginx-access-*的索引模式,并设@timestamp为时间字段
四、进阶建议:提升稳定性与可观测性
生产环境不只求通,更要稳和可维护:
- 启用 Filebeat 持久化队列(
queue.mem.events: 4096)或磁盘队列,避免 Logstash 短暂不可用导致日志丢失 - Logstash 使用
dead_letter_queue捕获解析失败事件,便于后续人工排查格式异常日志 - 为不同服务定义独立 pipeline(如 nginx、springboot、docker),用
if [fields][app] == "xxx"分流,避免单点故障影响全局 - 在 Kibana 中配置
Alerting规则,例如:5 分钟内 5xx 错误率超 5%,自动邮件通知运维群
整个链路无需重写代码,靠配置驱动,但每层都需主动验证输出,而非仅看服务是否启动。