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%,自动邮件通知运维群
整个链路无需重写代码,靠配置驱动,但每层都需主动验证输出,而非仅看服务是否启动。










