如何将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的事件处理遵循输入→过滤→输出的流程:
- 输入阶段:file插件读取文件时,会自动给每个事件添加
path字段,存储文件的完整路径。 - 过滤阶段:我们用ruby插件调用Ruby原生的
File.basename方法,从path里提取出目标文件名,并存为新的filename字段。 - 输出阶段:在elasticsearch插件的
index参数里用%{字段名}的语法,就能动态引用事件里的字段值,这里就是用filename字段的值作为索引名。
之前你尝试的方案没成功,大概率是字段提取的步骤没做对,或者引用字段的语法有误,按照上面的配置来肯定没问题~
内容的提问来源于stack exchange,提问作者Harsha Laxman
相关产品推荐
相关产品推荐

