ELK(Elasticsearch + Logstash + Kibana)是分布式日志分析的标准方案,配合Filebeat实现轻量级日志采集。相比传统grep/awk方式,ELK支持全文检索、时序聚合和可视化告警,适合微服务和容器化架构下海量日志的集中管理。
Elasticsearch集群部署与索引配置
使用Docker Compose部署三节点ES集群:
version: '3.8'
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
environment:
- node.name=es01
- cluster.name=elk-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms2g -Xmx2g"
- xpack.security.enabled=false
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es01-data:/usr/share/elasticsearch/data
ports:
- "9200:9200"
es02:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
environment:
- node.name=es02
- cluster.name=elk-cluster
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms2g -Xmx2g"
- xpack.security.enabled=false
volumes:
- es02-data:/usr/share/elasticsearch/data
volumes:
es01-data:
es02-data:
创建索引生命周期策略(ILM),自动管理日志索引的滚动和清理:
PUT _ilm/policy/logs-policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_size": "10gb",
"max_age": "1d"
}
}
},
"delete": {
"min_age": "14d",
"actions": {
"delete": {}
}
}
}
}
}
Filebeat日志采集与管道配置
Filebeat安装在每台应用服务器上,负责收集日志文件并发送到Elasticsearch:
# filebeat.yml
filebeat.inputs:
- type: filestream
id: app-logs
paths:
- /var/log/app/*.log
parsers:
- ndjson:
target: ""
overwrite_keys: true
add_error_key: true
- type: filestream
id: nginx-logs
paths:
- /var/log/nginx/access.log
parsers:
- multiline:
type: count
count: 1
processors:
- decode_json_fields:
fields: ["message"]
target: "json"
- add_fields:
target: host
fields:
env: production
- drop_fields:
fields: ["agent.ephemeral_id", "agent.id", "agent.version"]
output.elasticsearch:
hosts: ["es01:9200", "es02:9200"]
index: "app-logs-%{[agent][version]}"
pipeline: "parse-log-timestamp"
setup.ilm.enabled: true
setup.ilm.policy_id: "logs-policy"
setup.template.enabled: true
multiline配置处理Java异常堆栈日志,将多行日志合并为单条事件:
processors:
- multiline:
type: pattern
pattern: '^\d{4}-\d{2}-\d{2}'
negate: true
match_after: true
flush_pattern: '\d{4}-\d{2}-\d{2}'
Kibana可视化查询与仪表盘创建
Kibana查询语法:
# 全文检索
level:error AND service:order-service
# 字段精确匹配
response.status: 500
# 范围查询
response_time:[500 TO *]
# 通配符
message: *timeout*
# 组合查询
(level:error OR level:fatal) AND @timestamp:[now-1h TO now]
创建仪表盘的关键步骤:
- 进入Kibana Stack Management → Index Patterns,创建匹配模式
app-logs-* - Discover中验证日志数据正确解析,时间字段映射到
@timestamp - Dashboard中添加可视化组件:
- 日志级别分布饼图(Terms聚合,字段
level) - 错误趋势折线图(Date Histogram聚合,字段
@timestamp,按level分组) - Top异常服务柱状图(Terms聚合,字段
service,过滤level:error)
- 日志级别分布饼图(Terms聚合,字段
- 配置自动刷新间隔(5秒),实时监控线上日志
日志保留策略与性能优化
ES集群性能调优要点:
- 分片数按数据量设置,每分片建议10-50GB,日增10GB日志设3-5个主分片
- 副本数生产环境设1,保障高可用
- 关闭不需要的索引,减少集群资源开销:
POST app-logs-2024.01.01/_close - 使用冷热架构,热数据放SSD节点,旧索引迁移到机械硬盘节点
# 节点角色分配
# 热数据节点
node.roles: [data_hot, data_content]
# 冷数据节点
node.roles: [data_cold, data_content]
# 强制合并段,减少段数量提升查询性能
POST app-logs-2024.01.01/_forcemerge?max_num_segments=1
日志量大的场景(日增50GB+)考虑用Elasticsearch的Data Stream替代传统索引别名,配合ILM自动管理数据流转,减少人工维护成本。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/elk-ri-zhi-fen-xi-ping-tai-da-jian-shi-zhan-filebeat-cai-ji/