本文目录导读:

- 核心组件与作用
- 数据采集:Logstash & Filebeat
- 数据存储与索引:Elasticsearch
- 检索与可视化:Kibana
- 完整部署示例(Docker Compose)
- 关键优化与常见问题
- 进阶实践与生态
ELK(Elasticsearch, Logstash, Kibana)是目前业界最主流的开源日志采集、检索与可视化方案,下面为你梳理从数据采集到可视化的完整流程、核心组件及关键配置。
核心组件与作用
| 组件 | 功能 | 类比 |
|---|---|---|
| Logstash | 数据采集、解析、过滤、转换,支持多种输入(文件、TCP、Kafka、数据库等)和输出(ES、Kafka等)。 | 数据管道/ETL工具 |
| Elasticsearch | 分布式搜索引擎,负责存储、索引、检索日志数据,核心是倒排索引。 | 数据库 + 搜索引擎 |
| Kibana | 数据可视化平台,提供图表、仪表盘、日志搜索界面、告警管理、机器学习等功能。 | 数据显示与交互界面 |
| Beats (可选,强烈推荐) | 轻量级数据采集器家族(Filebeat, Metricbeat, Winlogbeat等),替代Logstash的采集端,减少资源消耗。 | 轻量数据搬运工 |
典型简化架构:
数据源 (应用/服务器) -> Filebeat -> Logstash (可选,可跳过) -> Elasticsearch -> Kibana
数据采集:Logstash & Filebeat
轻量采集:Filebeat (推荐)
适用于服务器日志文件、容器日志、系统日志。
配置示例 (filebeat.yml):
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
- /var/log/*.log
output.elasticsearch:
hosts: ["localhost:9200"]
# 可选:配置索引模板
index: "nginx-access-%{+yyyy.MM.dd}"
复杂处理:Logstash
适用于需要复杂过滤(正则、Grok解析)、转换、从数据库同步数据或需要缓冲的场景。
配置示例 (logstash.conf):
input {
beats {
port => 5044 # 接收来自Filebeat的数据
}
# 或者直接读取文件: file { path => "/var/log/*.log" }
}
filter {
# 使用grok解析Nginx日志格式
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
# 将字符串日期转为日期类型
date {
match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "nginx-access-%{+yyyy.MM.dd}"
}
}
数据存储与索引:Elasticsearch
- 索引:类似数据库中的表,日志数据按时间或业务创建索引(如
myapp-2025.01.01)。 - 分片与副本:分片实现分布式存储,副本提供高可用和查询吞吐量。
- 映射:定义字段类型(text, keyword, date, integer等),影响分词和聚合。
- 关键配置:
- 设置合适的分片数(es7+默认1)。
- 使用ILM(索引生命周期管理)自动管理热温冷节点、过期删除。
- 配置模板确保新索引自动使用正确映射。
检索与可视化:Kibana
检索功能
- Lucene Query / KQL (Kibana Query Language):在Discover页面输入
status: 500 AND response_time > 1000快速过滤。 - 字段过滤:左侧点击字段名即可筛选。
- 搜索语法:
- 精确匹配:
"Internal Server Error" - 通配符:
/api/v1/* - 范围:
response_time > 500 - 布尔:
AND,OR,NOT
- 精确匹配:
可视化(Visualize & Dashboard)
- 基础图表:柱状图、折线图(时间序列)、饼图、数据表。
- 地图:GeoIP坐标地理位置可视化。
- 自定义:Markdown、Vega(高级自定义图表)。
- TSVB:针对时间序列的强大多重指标可视化工具。
常见可视化场景:
- 错误监控:折线图显示错误请求数量随时间变化。
- 访问来源:饼图或地图显示请求来源国家/地区。
- 性能分析:直方图展示平均响应时间分布;热力图展示请求量随时间/用户纬度的变化。
- 用户行为:漏斗图展示转换率(如注册->登录->下单)。
告警(Alerting)与机器学习
- 规则引擎:设置条件(如
5分钟内错误数>10),触发邮件、Slack、Webhook、PagerDuty通知。 - 异常检测:基于历史数据自动学习阈值,检测偏离(如访问量突然下降或激增)。
完整部署示例(Docker Compose)
version: '3'
services:
elasticsearch:
image: elasticsearch:7.17.10
environment:
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms512m -Xmx512m
ports:
- "9200:9200"
- "9300:9300"
volumes:
- esdata:/usr/share/elasticsearch/data
kibana:
image: kibana:7.17.10
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
ports:
- "5601:5601"
depends_on:
- elasticsearch
logstash:
image: logstash:7.17.10
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
- ./logs:/var/log/nginx
ports:
- "5044:5044"
- "9600:9600"
depends_on:
- elasticsearch
volumes:
esdata:
关键优化与常见问题
| 问题 | 解决方案 |
|---|---|
| 性能慢 | ES分片数设置为节点数*1~3。 2. 使用 _source:false 只存需要字段。 3. ILM按时关闭或删除旧索引。 |
| 日志解析失败 | 在Logstash中使用 grok 调试工具(/usr/share/logstash/bin/logstash -f test.conf --debug)。 2. 设置 grok { break_on_match => false } 尝试多个模式。 |
| 索引膨胀 | 按天/周创建索引。 2. 开启ILM,设置热-温-冷-删策略。 |
| Kibana超时 | 缩短查询时间范围。 2. 使用Filtered Query或聚合优化。 3. 增加ES节点内存。 |
| 数据丢失 | Logstash/Filebeat增加重试队列。 2. 启用ES副本。 3. 使用Kafka缓冲。 |
进阶实践与生态
| 方向 | 工具/方案 |
|---|---|
| 架构演进 | Filebeat -> Kafka -> Logstash -> ES (解耦、高吞吐、削峰填谷) |
| 容器日志 | Filebeat配合Docker/Containerd socket采集容器标准输出、使用add_kubernetes_metadata 处理器采集K8s元数据 |
| 结构化日志 | 应用直接输出JSON格式日志,Logstash免解析直接输出,性能最高 |
| APM与链路追踪 | Elastic APM(集成于Kibana APM UI)采集应用性能指标 |
| 安全告警ELK Stack | 开启X-Pack安全特性、配置Elastic Security(主机安全、Siem) |
- 入门:
Filebeat + ES + Kibana就能跑通基础流水线。 - 落地:细化到具体业务日志的Grok解析、调优ES索引设置、设计Dashboard看板。
- 进阶:结合Kafka高可用、ILM策略管理、告警引擎构建自动化运维体系。
如果你需要针对某个组件(如Logstash的Grok正则规则、Kibana的Dashboard设计、ES的索引性能调优)的具体配置或排查思路,告诉我详细场景,我可以进一步给出示例。