如何在Logstash中添加当前目录名及父目录名作为字段?
如何用Logstash添加Artist和Album目录名作为字段
没问题,这个需求完全可以实现!核心思路是利用Logstash File输入插件自动生成的path字段——它会记录每个被处理文件的完整路径,我们只需要从这个路径里解析出对应的Artist和Album目录名就行。下面给你两种实用的实现方式:
方法一:使用Dissect过滤器(简单直观)
Dissect插件专门用来拆分结构化字符串,非常适合处理路径这种有固定层级的内容。假设你的文件完整路径格式是/任意父路径/ArtistName/AlbumName/SongsList.xml,可以这么配置:
filter { dissect { mapping => { "path" => "%{*}/%{artist}/%{album}/%{filename}" } } # 可选:如果不需要保留filename字段,用mutate删掉它 mutate { remove_field => ["filename"] } }
这里的%{*}表示忽略前面的所有路径部分,直接提取倒数第二和第三段作为album和artist字段,配置起来非常简洁。
方法二:使用Ruby过滤器(灵活适配复杂路径)
如果你的路径结构有特殊情况(比如层级不固定、存在特殊字符),Ruby过滤器可以提供更灵活的自定义逻辑:
filter { ruby { code => " # 按路径分隔符拆分(Linux/macOS用'/', Windows用'\\',注意转义) path_segments = event.get('path').split('/') # 倒数第二段是Album目录名,倒数第三段是Artist目录名 event.set('album', path_segments[-2]) event.set('artist', path_segments[-3]) " } }
如果是Windows环境,记得把split('/')改成split('\\'),因为Windows的路径分隔符是反斜杠,需要转义才能在Ruby代码里正确识别。
测试建议
配置完成后,可以临时在output部分添加stdout { codec => rubydebug },运行Logstash后查看控制台输出的事件,确认artist和album字段是否已经正确生成,没问题再接入你的索引即可。
内容的提问来源于stack exchange,提问作者Harish
相关产品推荐
相关产品推荐

