You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Filebeat按输入设置Elasticsearch索引名失效问题排查

问题根源与解决方案

问题核心

Filebeat输入段的index参数仅在Filebeat直接输出到Elasticsearch时生效。当你将日志输出到Logstash时,这个配置不会被自动传递到Logstash的元数据或字段中,Logstash完全读取不到这个值,自然无法用它来生成目标索引。而你把index移到output.logstash段时生效,是因为这个全局配置会把索引名写入[@metadata][index]传递给Logstash,但这种方式只能给所有输入设置同一个索引,不符合你多输入分索引的需求。

解决方案

步骤1:修改Filebeat配置,给每个输入添加专属索引标识

推荐用[@metadata]字段传递(不会污染业务日志字段),针对每个输入添加处理器注入元数据:

filebeat.inputs:
  - type: filestream
    id: "filestream-id"
    enabled: true
    paths:
      - /usr/share/filebeat/logs/*.log

fields_under_root: true

processors:
  - dissect:
      tokenizer: "/usr/share/filebeat/logs/%{service_name}.log"
      field: "log.file.path"
      target_prefix: ""
  # 给当前输入添加专属索引标识到元数据
  - add_fields:
      target: "@metadata"
      fields:
        target_index: "index-id"

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

后续添加新输入时,只需在对应input块下添加相同的add_fields处理器,修改target_index的值即可。

步骤2:修改Logstash配置,读取传递的索引标识生成目标索引

修改Logstash的elasticsearch输出段,替换索引模板为读取Filebeat传来的元数据:

input {
  beats {
    port => 5044
    codec => "json"
  }
}

filter {
  mutate {
    remove_field => ["[event][original]"]
  }
}

output {
  elasticsearch {
    # 用Filebeat传递的元数据作为索引前缀
    index => "%{[@metadata][target_index]}-%{+YYYY.MM.dd}"
    hosts=> "${ELASTIC_HOSTS}"
    user=> "${ELASTIC_USER}"
    password=> "${ELASTIC_PASSWORD}"
    cacert=> "certs/ca/ca.crt"
  }
  stdout {
    codec => rubydebug
  }
}

步骤3:验证配置

  1. 重启Filebeat和Logstash服务
  2. 查看Logstash标准输出,确认[@metadata][target_index]字段存在且值正确
  3. 登录Elasticsearch查看索引,确认生成了以index-id-YYYY.MM.dd命名的索引

内容的提问来源于stack exchange,提问作者daniu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 00:50:12