【问题标题】:Multiple custom grok patterns not matching, but they successfully match alone?多个自定义 grok 模式不匹配,但它们单独成功匹配?
【发布时间】:2025-11-29 03:15:01
【问题描述】:

Grok 匹配单个自定义模式,但在自定义模式组合时匹配。

完整、有效、可验证的示例

样本数据:

OK 05/20 20:12:10:067 ABC_02~~DE_02 FGH_IJK jsmith _A0011

自定义模式:

MMDD [0-1][0-9]/[0-3][0-9]
THREAD _A\w+

他们分开工作;具体来说,这种模式本身就有效:

%{MMDD:mmdd} 

// Result
{
  "mmdd": [
    [
      "05/20"
    ]
  ]
}

...而且这种模式本身就有效:

%{THREAD:thread}

// Result
{
  "thread": [
    [
      "_A0011"
    ]
  ]
}    

..但在一起,他们失败了:

%{MMDD:mmdd} %{THREAD:keyword}

No Matches

令人费解。 Tyvm 基思 :^)

在这里测试: https://grokdebug.herokuapp.com/

正则表达式资源: https://regex101.com/

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

根据下面 Jeff Y 的评论进行编辑

注意将keyword 更改为thread

// Grok Pattern
%{MMDD:mmdd}%{DATA}%{THREAD:thread}

// Result
{
  "mmdd": [
    [
      "05/20"
    ]
  ],
  "DATA": [
    [
      " 20:12:10:067 ABC_02~~DE_02 FGH_IJK jsmith "
    ]
  ],
  "thread": [
    [
      "_A0011"
    ]
  ]
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

根据 Jeff Y 在下面的第二条评论编辑 2

// Data - HACKED - Note move of _A0011 to after mm/dd
OK 05/20 _A0011 20:12:10:067 ABC_02~~DE_02 FGH_IJK jsmith 

// Grok Pattern
%{MMDD:mmdd} %{THREAD:thread}

// Result
{
  "mmdd": [
    [
      "05/20"
    ]
  ],
  "thread": [
    [
      "_A0011"
    ]
  ]
}

【问题讨论】:

  • 我认为整行(一起行)被视为一种模式,并且您尝试匹配的元素不仅仅是那个空格,“”,它们之间的数据。也许试试%{MMDD:mmdd}%{DATA}%{THREAD:keyword}
  • @JeffY 见上面的编辑。奇怪的是,对于使用标准模式的查询来说,这不是问题,可以很好地解析,如下所示:%{WORD:word} %{TIME:time}
  • 它试图将包括该空格在内的整行与示例数据相匹配。如果您的线程和数据中的 mmdd 字段之间只有一个空格,它将起作用。如果它们之间还有其他东西,你必须考虑它。 %{DATA} 是一个内置(核心)模式,基本上说“匹配任何东西”。 github.com/logstash-plugins/logstash-patterns-core/blob/master/…
  • @JeffY 见上面的编辑 2。当我破解数据并将线程名称 _A0011 移动到 mm/dd 05/20 旁边时,它确实匹配。
  • 在对此进行了一番思考之后,也许这些 Grok 调试器旨在调试一个 Grok 模式,然后再插入其他地方,它能够应用多种模式。它们不打算在一行上解析多个模式。

标签: regex elasticsearch logstash kibana logstash-grok


【解决方案1】:

Grok 将根据整个消息测试您的模式。

如果您的消息是 OK 05/20 _A0011 20:12:10:067 ABC_02~~DE_02 FGH_IJK jsmith 并且您只想要 05/20_A0011 部分,那么您的 grok 应该具有匹配字符串其余部分的模式,但不要将它们保存在字段中。

例如,模式%{WORD}%{SPACE}%{MMDD:mmdd}%{SPACE}%{THREAD:thread}%{SPACE}%{GREEDYDATA} 将匹配您的字符串,它将保存mmddthread 字段,但忽略其他所有内容。

【讨论】: