温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

ELK Stack日志清理如何自动化

发布时间:2026-01-04 03:18:55 来源:亿速云 阅读:239 作者:小樊 栏目:系统运维

ELK Stack日志清理自动化方案

一、推荐方案 ILM 索引生命周期管理

  • 适用场景:长期运行的日志系统,按时间切分(如 logs-YYYY.MM.DDDataStreams),希望由 Elasticsearch 自动完成滚动与删除。
  • 核心思路:创建 ILM 策略(如保留 30 天后删除),通过 索引模板 应用到匹配模式的新索引,写入侧使用 Rollover 别名DataStreams 触发滚动,ES 自动推进阶段并在到期时删除。
  • 快速示例(保留 30 天后删除):
    • 创建策略
      PUT _ilm/policy/30day_delete_policy
      {
        "policy": {
          "phases": {
            "hot": {
              "min_age": "0ms",
              "actions": {
                "rollover": { "max_age": "30d", "max_size": "50gb", "max_docs": 1000000 }
              }
            },
            "delete": {
              "min_age": "30d",
              "actions": { "delete": {} }
            }
          }
        }
      }
      
    • 创建索引模板并关联策略(按时间切分)
      PUT _index_template/logs_template
      {
        "index_patterns": ["logs-*"],
        "template": {
          "settings": {
            "number_of_shards": 1,
            "number_of_replicas": 1,
            "index.lifecycle.name": "30day_delete_policy",
            "index.lifecycle.rollover_alias": "logs_alias"
          }
        }
      }
      
    • 初始化首个写入索引(设置写入别名)
      PUT logs-000001
      { "aliases": { "logs_alias": { "is_write_index": true } } }
      
    • 验证与监控
      GET _ilm/status
      GET _cat/indices/logs-*?v&h=index,status,store.size,ilm.phase
      GET _ilm/explain/logs_alias
      
    • 使用 DataStreams 时:在 Kibana 创建 Index Lifecycle Policies,创建 Index Template 并开启 DataStream,Logstash/Filebeat 写入对应数据流即可,ILM 会自动管理滚动与删除。
  • 说明:ILM 是官方推荐方式,具备可观测(如 _ilm/explain)、可回滚、可灰度验证等优势,适合生产环境长期自动化治理。

二、脚本化清理 定时删除索引或按时间删除文档

  • 适用场景:索引未按 ILM 接入、临时应急、或需要按业务维度自定义保留规则。
  • 方案 A:按日期删除索引(适合按天命名的索引)
    • 示例脚本(保留最近 15 天
      #!/usr/bin/env bash
      ES="http://127.0.0.1:9200"
      KEEP_DAYS=15
      DATE=$(date -d "-${KEEP_DAYS} days" "+%Y.%m.%d")
      
      curl -XDELETE "${ES}/*-${DATE}*"
      
    • 定时任务(每天 0 点执行)
      0 0 * * * /opt/es-index-clear.sh
      
  • 方案 B:按时间范围删除文档(不依赖索引名,直接删 @timestamp 范围)
    curl -u user:pass -H 'Content-Type: application/json' -d'
    {
      "query": {
        "range": { "@timestamp": { "lt": "now-7d", "format": "epoch_millis" } }
      }
    }' -XPOST "http://127.0.0.1:9200/*-*/_delete_by_query?pretty"
    
    • 建议先用 ?dry_run=true 验证,再正式执行;大数据量时删除较慢,注意集群负载与 GC。
  • 方案 C:使用 Elasticsearch Curator(官方维护的运维工具)
    • 通过配置文件定义匹配规则与保留天数,定期执行即可,适合集中化、可重复的清理作业。
  • 说明:脚本化方式简单直接,适合过渡期或特殊索引治理;生产环境建议优先 ILM,脚本用于兜底与迁移期清理。

三、从源头控制 减少写入无效或过期日志

  • Filebeat 侧过滤:只采集近 N 天日志,避免把历史包袱写入 ES。
    filebeat.inputs:
      - type: log
        paths: ["/var/log/*.log"]
        ignore_older: 240h   # 忽略 10 天前修改的文件
        include_lines: ["INFO","WARN","ERROR"]
    
  • 说明:ignore_older 针对文件“最后修改时间”,适合按天轮转的日志目录;配合采集过滤能显著降低无效写入与存储压力。

四、别忘了系统组件自身日志的轮转

  • Logstash/Kibana/ES 进程日志也会随时间增长,建议使用 logrotate 做按日轮转与压缩。
  • Kibana 示例(/etc/logrotate.d/kibana)
    /data/kibana/logs/kibana.log {
      daily
      minsize 10M
      missingok
      notifempty
      dateext
      rotate 7
      compress
      delaycompress
      sharedscripts
      create 644 kibana kibana
      postrotate
        [ -e /var/run/kibana.pid ] && kill -USR1 $(cat /var/run/kibana.pid)
      endscript
    }
    
  • 说明:进程日志与业务日志分离治理,避免节点因日志占满磁盘导致异常。

五、落地与运维要点

  • 先小范围灰度:将 ILM 的 min_age 或脚本的保留天数设为较短值(如 1 天)验证策略与写入链路,再放大到目标保留周期。
  • 做好备份:在删除前通过 Snapshot 进行重要索引/数据流备份,必要时可快速恢复。
  • 可观测与告警:定期查看 ILM 状态执行历史,对失败与异常滚动/删除设置告警,确保清理任务稳定可靠。
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI