如何指定Filebeat processor脚本仅作用于特定Elasticsearch索引
条件不生效的问题原因与解决方案
你配置的匹配条件未生效的核心原因是字段路径错误:
Filebeat处理器执行阶段早于事件发送到Elasticsearch,目标索引值默认存储在事件的**@metadata._index元字段**中,而非顶层的_index字段。你配置的equals._index匹配的是事件顶层的普通字段,自然无法命中,因此条件不触发。
修正后的配置示例
如果需要匹配完整索引名,修改条件字段路径即可:
processors: - script: when: equals: "@metadata._index": "firewall-11.2021" lang: javascript id: my_filter1 file: ${path.config}/Script_A.js # 匹配switch类索引可以用前缀匹配,适配按月生成的动态索引名 - script: when: prefix: "@metadata._index": "switch-" lang: javascript id: my_filter2 file: ${path.config}/Script_B.js
更优的备选方案
如果你的firewall和switch两类日志对应不同的Filebeat输入源,可直接将脚本处理器配置在对应input块下,无需额外做索引匹配判断,执行效率更高:
filebeat.inputs: - type: filestream paths: /var/log/firewall/*.log processors: - script: lang: javascript id: my_filter1 file: ${path.config}/Script_A.js output.elasticsearch: index: "firewall-%{+yyyy.MM}" - type: filestream paths: /var/log/switch/*.log processors: - script: lang: javascript id: my_filter2 file: ${path.config}/Script_B.js output.elasticsearch: index: "switch-%{+yyyy.MM}"
脚本应用方式的性能差异
- 全局应用脚本:所有事件都需要完整执行一次JavaScript脚本逻辑,开销固定。
- 指定索引应用脚本:先执行原生实现的轻量字段条件匹配(开销可忽略不计),只有匹配到目标索引的事件才会执行JavaScript脚本逻辑。
只要匹配目标索引的事件占比不是100%,指定索引应用的性能会显著优于全局脚本;即便所有事件都匹配索引条件,额外的条件判断开销几乎可以忽略,和全局脚本性能没有可感知的差异。
内容的提问来源于stack exchange,提问作者Sederfo
相关产品推荐
相关产品推荐

