ELK日志系统生产环境最佳实践:从采集到可视化全流程指南
情境与背景
ELK(Elasticsearch、Logstash、Kibana)是目前最流行的开源日志收集分析平台,被广泛应用于企业级日志管理、监控告警和安全审计。本文从DevOps/SRE视角,深入讲解ELK日志收集的完整流程、核心组件配置、生产环境优化以及大规模场景下的最佳实践。
一、ELK架构概述
1.1 ELK核心组件
| 组件 | 功能定位 | 核心能力 |
|---|---|---|
| Filebeat | 轻量日志采集器 | 实时采集、低资源消耗、自动恢复 |
| Logstash | 日志处理管道 | 过滤、转换、解析、字段丰富 |
| Elasticsearch | 分布式搜索存储 | 全文检索、聚合分析、水平扩展 |
| Kibana | 可视化平台 | 仪表盘、报表、告警、用户管理 |
1.2 标准架构流程
flowchart LR
subgraph 日志采集层
A["应用服务器"] --> F1["Filebeat"]
B["数据库"] --> F2["Filebeat"]
C["容器"] --> F3["Filebeat"]
D["网络设备"] --> F4["Filebeat"]
end
subgraph 消息队列层(可选)
K["Kafka"]
end
subgraph 日志处理层
L["Logstash"]
end
subgraph 存储检索层
E["Elasticsearch集群"]
end
subgraph 可视化层
Kib["Kibana"]
end
F1 --> K
F2 --> K
F3 --> K
F4 --> K
K --> L
L --> E
E --> Kib
style A fill:#e3f2fd
style F1 fill:#c8e6c9
style K fill:#fff3e0
style L fill:#ffcdd2
style E fill:#f3e5f5
style Kib fill:#bbdefb
二、日志收集流程详解
2.1 第一步:Filebeat采集
Filebeat配置示例:
# filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/*.log
- /opt/app/logs/*.log
# 多行日志处理(Java堆栈)
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
multiline.negate: true
multiline.match: after
# 自定义字段
fields:
service: myapp
env: production
# 排除特定日志
exclude_lines: ['^DEBUG']
# 输出到Kafka
output.kafka:
hosts: ["kafka-01:9092", "kafka-02:9092", "kafka-03:9092"]
topic: "logs-%{[fields.env]}"
partition.round_robin:
reachable_only: true
required_acks: 1
compression: gzip
# 输出到Logstash(直连模式)
# output.logstash:
# hosts: ["logstash-01:5044", "logstash-02:5044"]
# 监控配置
monitoring:
enabled: true
elasticsearch:
hosts: ["es-01:9200", "es-02:9200"]
Filebeat核心配置说明:
| 配置项 | 说明 |
|---|---|
paths |
日志文件路径,支持通配符 |
multiline |
多行日志处理,处理堆栈信息 |
fields |
自定义字段,用于分类和过滤 |
exclude_lines |
排除特定模式的日志行 |
output.kafka |
输出到Kafka,适合大规模场景 |
output.logstash |
直接输出到Logstash,适合小规模场景 |
2.2 第二步:Kafka缓冲(可选)
Kafka配置要点:
# topic创建命令
kafka-topics.sh --create \
--topic logs-production \
--bootstrap-server kafka-01:9092 \
--partitions 12 \
--replication-factor 3 \
--config retention.ms=86400000 # 1天保留
Kafka优势:
- 解耦采集与处理:Filebeat和Logstash解耦
- 削峰填谷:处理流量突发
- 持久化保障:消息不丢失
- 水平扩展:支持大规模日志
2.3 第三步:Logstash处理
Logstash配置示例:
# logstash.conf
input {
kafka {
bootstrap_servers => "kafka-01:9092,kafka-02:9092,kafka-03:9092"
topics => ["logs-production", "logs-staging"]
group_id => "logstash-consumer"
auto_offset_reset => "latest"
}
}
filter {
# Grok解析(Nginx日志示例)
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
# JSON解析
json {
source => "message"
target => "json"
}
# 日期解析
date {
match => [ "timestamp", "yyyy-MM-dd HH:mm:ss", "ISO8601" ]
target => "@timestamp"
}
# 字段过滤
mutate {
remove_field => ["message", "host", "agent"]
add_field => { "log_source" => "%{[fields][service]}" }
}
# GeoIP(可选)
geoip {
source => "clientip"
target => "geoip"
}
}
output {
elasticsearch {
hosts => ["es-01:9200", "es-02:9200", "es-03:9200"]
index => "logs-%{[fields][env]}-%{+YYYY.MM.dd}"
ilm_enabled => true
ilm_pattern => "{now/d}-000001"
ilm_rollover_alias => "logs-%{[fields][env]}"
}
# 调试输出(开发环境)
# stdout { codec => rubydebug }
}
Logstash常用过滤器:
| 过滤器 | 功能 | 示例 |
|---|---|---|
grok |
正则解析非结构化日志 | %{COMBINEDAPACHELOG} |
json |
解析JSON格式日志 | source => "message" |
date |
日期字段处理 | 解析timestamp到@timestamp |
mutate |
字段增删改 |
remove_field, add_field
|
geoip |
IP地理位置解析 | 根据clientip获取地域信息 |
useragent |
User-Agent解析 | 浏览器、设备信息提取 |
2.4 第四步:Elasticsearch存储
Elasticsearch索引管理:
# 创建索引模板
PUT _index_template/logs-template
{
"index_patterns": ["logs-*"],
"template": {
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2,
"index.refresh_interval": "30s"
},
"mappings": {
"properties": {
"@timestamp": { "type": "date" },
"clientip": { "type": "ip" },
"response": { "type": "integer" },
"bytes": { "type": "long" },
"log_source": { "type": "keyword" }
}
}
}
}
# ILM策略(索引生命周期管理)
PUT _ilm/policy/logs-policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_size": "50GB",
"max_age": "7d"
}
}
},
"warm": {
"min_age": "7d",
"actions": {
"forcemerge": { "max_num_segments": 1 },
"shrink": { "number_of_shards": 1 }
}
},
"delete": {
"min_age": "30d",
"actions": { "delete": {} }
}
}
}
}
Elasticsearch性能优化:
| 优化项 | 配置 | 说明 |
|---|---|---|
| 分片数 | number_of_shards: 3 |
根据数据量调整 |
| 副本数 | number_of_replicas: 2 |
生产环境至少1个 |
| 刷新间隔 | refresh_interval: 30s |
减少刷新频率提升写入性能 |
| JVM堆内存 | Xms=Xmx=8g |
不超过物理内存50% |
| 磁盘选择 | SSD | 提升IO性能 |
2.5 第五步:Kibana可视化
Kibana仪表盘配置:
// 示例:创建日志仪表盘
{
"title": "应用日志监控",
"panels": [
{
"type": "line",
"data_source": "logs-*",
"query": "log_source: myapp AND level: ERROR",
"x_axis": "@timestamp",
"y_axis": "count"
},
{
"type": "bar",
"data_source": "logs-*",
"query": "log_source: myapp",
"x_axis": "response",
"y_axis": "count"
},
{
"type": "table",
"data_source": "logs-*",
"query": "level: ERROR",
"columns": ["@timestamp", "message", "clientip"]
}
]
}
Kibana核心功能:
| 功能 | 用途 |
|---|---|
| Discover | 日志实时查询 |
| Visualize | 图表制作 |
| Dashboard | 仪表盘组合 |
| Alerting | 告警配置 |
| Canvas | 报告制作 |
三、生产环境最佳实践
3.1 架构选型建议
| 场景 | 推荐架构 | 说明 |
|---|---|---|
| 小规模(<100节点) | Filebeat → Logstash → ES | 直连模式,简单高效 |
| 中大规模(100-1000节点) | Filebeat → Kafka → Logstash → ES | 引入Kafka解耦 |
| 超大规模(>1000节点) | Filebeat → Kafka → Logstash集群 → ES集群 | 全链路水平扩展 |
3.2 高可用部署
Elasticsearch集群部署:
# docker-compose.yml (ES集群)
version: '3'
services:
es-01:
image: elasticsearch:8.11.0
environment:
- node.name=es-01
- cluster.name=es-cluster
- discovery.seed_hosts=es-02,es-03
- cluster.initial_master_nodes=es-01,es-02,es-03
- ES_JAVA_OPTS=-Xms8g -Xmx8g
volumes:
- es-data-01:/usr/share/elasticsearch/data
ports:
- "9200:9200"
es-02:
image: elasticsearch:8.11.0
environment:
- node.name=es-02
- cluster.name=es-cluster
- discovery.seed_hosts=es-01,es-03
- cluster.initial_master_nodes=es-01,es-02,es-03
- ES_JAVA_OPTS=-Xms8g -Xmx8g
volumes:
- es-data-02:/usr/share/elasticsearch/data
es-03:
image: elasticsearch:8.11.0
environment:
- node.name=es-03
- cluster.name=es-cluster
- discovery.seed_hosts=es-01,es-02
- cluster.initial_master_nodes=es-01,es-02,es-03
- ES_JAVA_OPTS=-Xms8g -Xmx8g
volumes:
- es-data-03:/usr/share/elasticsearch/data
3.3 安全配置
Elasticsearch安全配置:
# 启用安全功能
elasticsearch-security-setup auto
配置文件:
# elasticsearch.yml
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12
# 用户权限配置
# 创建只读用户
elasticsearch-users useradd readonly_user -p password123 -r viewer
3.4 监控与告警
监控指标:
| 指标类型 | 监控内容 |
|---|---|
| Filebeat | 采集数量、错误率、发送延迟 |
| Kafka | 消息堆积、分区状态、消费延迟 |
| Logstash | 处理速率、队列长度、错误率 |
| Elasticsearch | 集群健康、分片状态、磁盘使用率 |
告警规则示例:
{
"alert": {
"name": "ES集群告警",
"conditions": [
{
"type": "compare",
"query": {
"match": { "cluster.health.status": "red" }
},
"time_window": "5m"
}
],
"actions": [
{
"type": "webhook",
"url": "https://api.pagerduty.com/incidents",
"headers": { "Authorization": "Token token=YOUR_TOKEN" },
"body": "{\"incident\":{\"title\":\"ES集群异常\",\"service\":{\"id\":\"P12345\"}}}"
}
]
}
}
四、故障排查指南
4.1 常见问题
| 问题 | 现象 | 排查方向 |
|---|---|---|
| 日志不入库 | Kibana查不到日志 | 检查Filebeat输出、Kafka消息、Logstash配置 |
| ES集群red | 分片未分配 | 检查磁盘空间、网络连通性、分片配置 |
| 日志延迟高 | 日志延迟超过预期 | 检查Kafka堆积、Logstash性能、ES写入速度 |
| Grok解析失败 | 日志字段未正确提取 | 检查grok pattern、日志格式变化 |
4.2 排查命令
# 检查Filebeat状态
filebeat test output
# 检查Logstash管道
curl -XGET 'http://logstash:9600/_node/pipeline'
# 检查ES集群健康
curl -XGET 'http://es:9200/_cluster/health?pretty'
# 检查Kafka消费组
kafka-consumer-groups.sh --describe --group logstash-consumer --bootstrap-server kafka:9092
五、面试1分钟精简版(直接背)
完整版:
ELK日志收集流程分为五步:Filebeat采集、Kafka缓冲、Logstash处理、Elasticsearch存储、Kibana展示。Filebeat部署在各主机上轻量采集日志,通过TCP或Kafka发送给Logstash;Logstash做grok解析、JSON提取、字段过滤等处理;然后写入Elasticsearch建立索引;最后通过Kibana进行查询分析和可视化。大型场景会用Kafka做缓冲,实现采集与处理解耦,提高系统稳定性。生产环境还需要配置ILM索引生命周期管理、安全认证、监控告警等。
30秒超短版:
ELK流程是Filebeat采、Logstash转、ES存、Kibana看。Filebeat轻量采集,Logstash解析处理,ES索引存储,Kibana可视化。大型场景加Kafka解耦。
六、总结
6.1 核心要点
- 架构分层:采集层(Filebeat)、缓冲层(Kafka)、处理层(Logstash)、存储层(ES)、可视化层(Kibana)
- 关键配置:多行日志处理、Grok解析、ILM策略、安全认证
- 性能优化:分片配置、JVM调优、SSD磁盘、刷新间隔调整
- 高可用:ES集群、多副本、故障自动转移
6.2 选型建议
| 组件 | 选型建议 |
|---|---|
| 采集器 | Filebeat(轻量、稳定) |
| 消息队列 | Kafka(大规模场景必选) |
| 处理引擎 | Logstash(功能强大)或Beats直接写入ES(轻量场景) |
| 存储 | Elasticsearch(全文检索优势) |
6.3 记忆口诀
Filebeat采集轻又快,Kafka中间来缓冲,
Logstash处理做转换,ES存储建索引,
Kibana展示做分析,ELK日志全搞定。
文档信息
- 本文作者:soveran zhong
- 本文链接:https://blog.clockwingsoar.cn/2026/05/08/elk-log-collection-best-practices/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)