ELK Stack日志分析平台搭建实战:日志采集到可视化告警

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/

(0)
小编小编
上一篇 4小时前
下一篇 4小时前

相关推荐