Logstash translate过滤器仅生效第二个,第一个被忽略求助
Logstash Grok+Translate多MAC厂商匹配问题解决
问题场景
在Logstash 7.10.2和7.17.2版本中,尝试通过grok提取源MAC、目的MAC的前6位字符,再用translate过滤器匹配MAC厂商字典时出现异常:
- 当grok同时配置源、目的MAC的匹配规则时,仅目的MAC的厂商字段能生成,源MAC相关字段完全丢失
- 单独配置源MAC的匹配规则时,能正常生成对应的厂商字段
原错误代码片段:
if [source][mac] or [destination][mac] { grok { tag_on_failure => [ "vendorsmac_grok" ] pattern_definitions => { SRC_VENDOR => "^(?<[vendor][source][mac]>.{6}).+" DST_VENDOR => "^(?<[vendor][destination][mac]>.{6}).+" } match => { "[source][mac]" => "%{SRC_VENDOR}" "[destination][mac]" => "%{DST_VENDOR}" } } translate { dictionary_path => "/etc/logstash/dictionary/mac_vendor.yml" field => "[vendor][source][mac]" destination => "[vendor][source][name]" fallback => "unknown device SRC VENDOR" add_tag => "Vendor_SRC_MAC" } translate { dictionary_path => "/etc/logstash/dictionary/mac_vendor.yml" field => "[vendor][destination][mac]" destination => "[vendor][destination][name]" fallback => "unknown device DST VENDOR" add_tag => "Vendor_DST_MAC" } }
问题原因
- Grok捕获组命名错误:正则捕获组中嵌套字段的正确写法应为
(?<vendor.source.mac>.{6})(点号分隔层级),而非(?<[vendor][source][mac]>.{6})。错误的命名方式会导致Logstash无法正确识别嵌套字段结构,多字段匹配时后续捕获会覆盖或丢弃前序结果。 - 多字段匹配的失败回滚:Grok过滤器默认会在任意一个字段匹配失败(包括字段不存在)时,回滚所有已完成的字段捕获操作。即使事件中同时存在源、目的MAC,错误的字段命名也会触发逻辑异常,最终仅保留最后一个字段的捕获结果。
修复方案
将原单grok拆分为两个独立的逻辑块,分别处理源MAC和目的MAC,同时修正捕获组的字段命名:
if [source][mac] or [destination][mac] { # 单独处理源MAC的厂商前缀提取 if [source][mac] { grok { tag_on_failure => [ "vendorsmac_grok_source" ] match => { "[source][mac]" => "^(?<vendor.source.mac>.{6}).+" } } translate { dictionary_path => "/etc/logstash/dictionary/mac_vendor.yml" field => "[vendor][source][mac]" destination => "[vendor][source][name]" fallback => "unknown device SRC VENDOR" add_tag => "Vendor_SRC_MAC" } } # 单独处理目的MAC的厂商前缀提取 if [destination][mac] { grok { tag_on_failure => [ "vendorsmac_grok_destination" ] match => { "[destination][mac]" => "^(?<vendor.destination.mac>.{6}).+" } } translate { dictionary_path => "/etc/logstash/dictionary/mac_vendor.yml" field => "[vendor][destination][mac]" destination => "[vendor][destination][name]" fallback => "unknown device DST VENDOR" add_tag => "Vendor_DST_MAC" } } }
修复说明
- 拆分grok为独立逻辑块,每个块仅处理一个MAC字段,避免单个字段匹配失败影响另一字段的结果
- 修正捕获组字段命名为
vendor.source.mac格式,符合Logstash嵌套字段规范,确保grok能正确生成目标字段 - 为每个grok设置独立的失败标签,便于后续排查单字段的匹配异常
验证结果
修改后,无论事件中仅存在源MAC、仅存在目的MAC,还是两者同时存在,都能正确提取MAC前缀并匹配对应的厂商名称,示例输出:
"vendor" => { "source" => { "name" => "Wistron", "mac" => "54EE75" }, "destination" => { "name" => "unknown device DST VENDOR", "mac" => "9077EE" } }
内容的提问来源于stack exchange,提问作者h0llym0lly
相关产品推荐
相关产品推荐

