ELK Stack(Elasticsearch + Logstash + Kibana)是网站运维中构建集中式日志分析平台的事实标准。在海量日志场景下,ELK提供了从日志采集、清洗、存储到可视化、告警的完整链路,是DevOps实践和SRE稳定性工程中不可或缺的监控基础设施。
Elasticsearch集群部署与索引配置
Elasticsearch作为ELK的存储和检索引擎,生产环境至少部署3节点集群以保障高可用。每个节点配置如下:
# elasticsearch.yml
cluster.name: elk-prod
node.name: elk-node-1
network.host: 0.0.0.0
discovery.seed_hosts: ["10.0.1.11", "10.0.1.12"]
cluster.initial_master_nodes: ["elk-node-1", "elk-node-2", "elk-node-3"]
# 索引生命周期管理(ILM)
PUT _ilm/policy/logs-policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_size": "50GB",
"max_age": "7d"
}
}
},
"delete": {
"min_age": "30d",
"actions": {
"delete": {}
}
}
}
}
}
ILM策略自动管理索引生命周期:热数据索引超过50GB或7天后滚动创建新索引,30天后自动删除旧索引。这能有效控制磁盘使用量,避免日志数据无限增长撑爆存储。Elasticsearch建议分配JVM堆内存为物理内存的50%,但不超过32GB以利用指针压缩。
Logstash日志采集管道与过滤规则
Logstash负责日志的采集、解析和转换。通过input、filter、output三个阶段构建处理管道。对于Nginx访问日志,常用grok模式解析:
# logstash.conf
input {
beats {
port => 5044
}
}
filter {
if [type] == "nginx-access" {
grok {
match => {
"message" => '%{IPORHOST:client_ip} - %{DATA:user} \[%{HTTPDATE:timestamp}\] "%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:http_version}" %{NUMBER:status} %{NUMBER:bytes} "%{DATA:referer}" "%{DATA:agent}" %{NUMBER:response_time}'
}
}
mutate {
convert => {
"status" => "integer"
"bytes" => "integer"
"response_time" => "float"
}
}
date {
match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
target => "@timestamp"
}
}
# 错误日志降级处理
if [log_level] in ["ERROR", "FATAL"] {
mutate {
add_tag => ["alert"]
}
}
}
output {
elasticsearch {
hosts => ["10.0.1.11:9200"]
index => "logs-%{type}-%{+YYYY.MM.dd}"
ilm_rollover_alias => "logs-nginx"
ilm_pattern => "{now/d}-000001"
}
}
grok模式基于正则表达式解析非结构化日志,解析后会生成client_ip、method、status等结构化字段。mutate过滤器将字段类型从字符串转为数值,便于后续聚合统计。date过滤器将日志中的时间戳映射到@timestamp字段,确保时间线正确。
Kibana可视化仪表盘配置
Kibana提供可视化界面,通过Index Pattern关联Elasticsearch索引后即可创建仪表盘。常用可视化组件包括:
- 时间线折线图(Lens):展示请求量、错误率随时间变化趋势
- 饼图:按HTTP状态码分布统计
- 数据表:慢请求排行,按response_time降序展示
- 指标板:实时显示QPS、平均响应时间、错误率等核心指标
// Kibana Dev Tools中创建索引模式
PUT _index_template/logs-template
{
"index_patterns": ["logs-*"],
"template": {
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"@timestamp": { "type": "date" },
"client_ip": { "type": "ip" },
"status": { "type": "integer" },
"response_time": { "type": "float" },
"method": { "type": "keyword" },
"request": { "type": "text" }
}
}
}
}
合理的字段类型映射直接影响查询性能。status和method设为keyword类型支持精确过滤和聚合,request设为text类型支持全文检索,client_ip设为ip类型支持CIDR范围查询。
Filebeat轻量日志采集替代方案
在资源受限的环境中,可以用Filebeat替代Logstash进行日志采集。Filebeat直接安装在应用服务器上,占用资源极少,支持将日志直接发送到Elasticsearch:
# filebeat.yml
filebeat.inputs:
- type: log
paths:
- /var/log/nginx/access.log
fields:
type: nginx-access
fields_under_root: true
processors:
- decode_json_fields:
fields: ["message"]
process_array: false
max_depth: 1
- add_fields:
target: ''
fields:
env: production
output.elasticsearch:
hosts: ["10.0.1.11:9200"]
indices:
- index: "logs-nginx-%{+yyyy.MM.dd}"
# 需要复杂解析时转发到Logstash
# output.logstash:
# hosts: ["10.0.1.20:5044"]
告警规则配置与通知集成
Kibana内置Alerting功能支持基于条件的告警规则。配置HTTP状态码5xx错误率告警:
PUT _detector/api/detectors
{
"name": "nginx-5xx-alert",
"type": "monitor",
"enabled": true,
"schedule": { "period": { "interval": 1, "unit": "MINUTES" }},
"query": {
"query": "status:>=500 AND @timestamp:[now-5m TO now]"
},
"actions": [{
"type": "webhook",
"webhook": {
"url": "https://hooks.slack.com/services/xxx",
"method": "POST",
"body": "{\"text\": \"5xx错误: {{ctx.results.0.hits.total.value}} 次\"}"
}
}]
}
告警规则每分钟执行一次查询,当5分钟内5xx错误超过阈值时触发Webhook通知到Slack。对于更复杂的告警场景,可以结合ElastAlert2或自研监控脚本实现多级告警(P0电话、P1短信、P2邮件),配合故障应急响应流程确保问题及时发现和处理。日志分析平台的日常运维重点包括:监控Elasticsearch集群健康状态(green/yellow/red)、索引分片分布均衡性、JVM GC频率和耗时,以及磁盘使用率预警。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/elkstack-ri-zhi-fen-xi-ping-tai-da-jian-shi-zhan-ri-zhi-cai/