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

如何将Logstash读取的文件名设为ElasticSearch索引?

用文件名作为Elasticsearch索引名的Logstash配置方案

嘿,我来帮你搞定这个问题!你现在的需求是让Logstash把每个上传文件的内容索引到Elasticsearch时,用文件名作为索引名对吧?咱们一步步调整配置,保证能解决问题。

  • 首先你的输入配置已经能正确读取目标文件夹下的文件了,但要动态获取文件名,得先在过滤阶段把文件名从自动生成的path字段里提取出来。
  • 这里推荐用Logstash的ruby插件来提取文件名,兼容性和灵活性都很好:
filter {
  ruby {
    code => "event.set('filename', File.basename(event.get('path'), '.*'))"
  }
}

这段代码的作用是:从path字段(比如C:/ProjectName/Uploads/test.txt)里提取出不带扩展名的文件名(test)。如果你想要保留扩展名的完整文件名,把代码里的'.*'去掉就行,改成File.basename(event.get('path'))。

  • 接下来修改你的输出配置,把index的值改成动态引用提取出的filename字段:
output {
  elasticsearch {
    hosts => "localhost"
    index => "%{filename}"  # 这里用提取出的filename字段作为索引名
    document_type => "_doc"
  }
}
  • 最后整合起来的完整配置文件是这样的:
input {
  file {
    path => "C:/ProjectName/Uploads/*"
    start_position => "beginning"
    sincedb_path => "dev/null"
  }
}

filter {
  ruby {
    code => "event.set('filename', File.basename(event.get('path'), '.*'))"
  }
}

output {
  elasticsearch {
    hosts => "localhost"
    index => "%{filename}"
    document_type => "_doc"
  }
}

原理说明

Logstash的事件处理遵循输入→过滤→输出的流程:

  1. 输入阶段:file插件读取文件时,会自动给每个事件添加path字段,存储文件的完整路径。
  2. 过滤阶段:我们用ruby插件调用Ruby原生的File.basename方法,从path里提取出目标文件名,并存为新的filename字段。
  3. 输出阶段:在elasticsearch插件的index参数里用%{字段名}的语法,就能动态引用事件里的字段值,这里就是用filename字段的值作为索引名。

之前你尝试的方案没成功,大概率是字段提取的步骤没做对,或者引用字段的语法有误,按照上面的配置来肯定没问题~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:28:56