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

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"
    }
  }

问题原因

  1. Grok捕获组命名错误:正则捕获组中嵌套字段的正确写法应为(?<vendor.source.mac>.{6})(点号分隔层级),而非(?<[vendor][source][mac]>.{6})。错误的命名方式会导致Logstash无法正确识别嵌套字段结构,多字段匹配时后续捕获会覆盖或丢弃前序结果。
  2. 多字段匹配的失败回滚: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:09:10