ELK日志收集,非ILM生命周期管理、ILM生命周期管理索引配置

✍️Auth:运维笔记       Date:2025/06/5       Cat:Linux服务器windows相关       👁️:20 次浏览

1:Filebeat配置

在9.0+版本中,filebeat.inputs: type不在支持log 类型。

Elastic 官方已经推荐全面改用 filestreamlog 类型在新版 Filebeat 中会报错并终止运行。

filestream性能更优,可以同时支持多个日志类型同时采集。

配置文件,主要三个配置:

  • 1:http开启,采集监控到Metricbeat。
  • 2: filebeat.inputs:日志格式采集部分。
  • 3: output.logstash: 采集日志到logstash处理。
http:
  enabled: true
  host: "0.0.0.0"
  port: 5066
monitoring.enabled: false
monitoring.cluster_uuid: "GuZRw-10QzueZyaIszr7HQ"

filebeat.inputs:
  - type: filestream
    id: nginx-dev-logs
    enabled: true
    paths:
      - /app/logs/nginx/dev/*.log
    fields:
      env: dev
      app: nginx
    fields_under_root: false
  - type: filestream
    id: syslog-logs
    enabled: true
    paths:
      - /var/log/syslog
    fields:
      env: dev
      app: syslog
    fields_under_root: false

output.logstash:
  hosts: ["198.19.249.234:5044"]

上面配置了http日志采集后,在Metricbeat将 host加上去即可。

Metricbeat监控参考文章:docker-compose 安装启动ELK 9.0,和metricbeat监控

root@ubuntu-elk:/opt/elk# cat metricbeat/modules.d/beat-xpack.yml 
# Module: beat
# Docs: https://www.elastic.co/guide/en/beats/metricbeat/main/metricbeat-module-beat.html

- module: beat
  xpack.enabled: true
  period: 10s
  hosts: ["http://metricbeat:5066","http://198.19.249.107:5066"]
  username: "remote_monitoring_user"
  password: "remote1234"

2: 非ILM生命周期管理

非ILM生命周期管理比较简单,按日期,每天生成一个索引。

优点:简单直观,一个通用模版可以绑定所有的日志类型。

缺点:一个集群,每个节点默认最多 管理 1000 个 shards(分片),包含主分片和副本分片。如果30个日志类型,一个月就是900加上其他的日志,性能会严重下降,甚至索引失败。

如果日志类型不是很多,而且不需要保留太久,可以优先用这种模式。

2.1: Elastic配置

创建生命周期策略

创建一个7天删除的周期策略,不需要rollover

PUT _ilm/policy/delete-after-7-days
{
  "policy": {
    "phases": {
      "delete": {
        "min_age": "7d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}

创建通用模版

PUT _index_template/logs-template
{
  "index_patterns": ["dev-*-logs*"],
  "template": {
    "settings": {
      "index.lifecycle.name": "delete-after-7-days"
    }
  }
}

上面模版,同时支持所有的dev-*-logs* 格式类型。

如:dev-nginx-logs-2025.06.10, dev-syslog-logs-2025.06.11 ….

2.2: Logstash数据流配置

input {
  beats {
    port => 5044
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    user => "elastic"
    password => "qwe123"

    # 自定义索引名,使用 filebeat 传来的字段
    index => "%{[fields][env]}-%{[fields][app]}-logs-%{+YYYY.MM.dd}"

    # 关闭 ILM 管理
    ilm_enabled => false
  }

最后重启logstash,查看索引,每天自动生成一个索引,7天后删除旧索引。

3: ILM生命周期管理

用 ILM 时,你只需要维护一个 alias,Elasticsearch 自动 rollover(翻转索引),控制 分片总量索引数量

如果有大量类型日志,时间又比较久,推荐又这种。

如果用非ILM管理,有些日志每天就1M左右,但是第二天还是创建新索引,浪费分片数量。

缺点也很明显,前期配置复杂,需要为每个日志类型创建一个模版。

3.1: Elastic配置

自己须提前在 Elasticsearch 中定义与 ilm_rollover_alias 匹配的索引模板(Index Template)和设置别名指向初始索引。

创建 ILM policy(一次性操作):

PUT _ilm/policy/log-policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_age": "1d",
            "max_docs": 100,
            "max_size": "5gb"
          }
        }
      },
      "delete": {
        "min_age": "7d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}

由于测试,rollover设置得比较小,以下达到任意条件,创建新索引(-000002, -000003…):

“max_age”: “1d”, 索引年龄超过 1 天。
“max_docs”: 100 分片文档数超过100。
“max_size”: “5gb” 索引主分片大小超过 5GB。(已弃用,系统仍支持它,可能在未来版本中不再推荐)

“min_age”: “7d”, 删除超过7天的索引。

创建对应的template模版:

PUT _index_template/dev-syslog-logs-template
{
  "index_patterns": ["dev-syslog-logs-*"],
  "template": {
    "settings": {
      "index.lifecycle.name": "log-policy",
      "index.lifecycle.rollover_alias": "dev-syslog-logs",
      "number_of_shards": 1
    }
  },
  "priority": 100
}

ILM必须设置别名index.lifecycle.rollover_alias,只能固定值,不支持动态传参。

一个别名只能绑定一个类型的日志,所以意味着1个日志类型需要创建1个模版。

“number_of_shards”: 1 , 主分片数,默认是 5,但很多日志场景(如 ELK)改为 1,避免小索引过度分片。

初始化首个写入索引(只需一次):

PUT dev-syslog-logs-000001
{
  "aliases": {
    "dev-syslog-logs": {
      "is_write_index": true
    }
  }
}

3.2: Logstash数据流配置

input设置采集端口,外部进来的端口。

root@ubuntu-elk:/opt/elk# cat logstash/pipeline/logstash.conf 
input {
  beats {
    port => 5044
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    user => "elastic"
    password => "qwe123"

        #开启ILM管理
    ilm_enabled => true
    #别名名称
    ilm_rollover_alias => "%{[fields][env]}-%{[fields][app]}-logs"
    #自动 rollover 的命名格式,下一轮000002...
    ilm_pattern => "000001"
    #绑定ILM策略
    ilm_policy => "log-policy"

    manage_template => false
    ssl_enabled => false
  }
}

配置后,重启,等待一会,检测索引正常rollover。

打赏作者

发表评论