首页 > 解决方案 > 多个自定义 grok 模式不匹配,但它们单独成功匹配?

问题描述

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

令人费解。泰姆·基思 :^)

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

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

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

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

注意更改keywordthread

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

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

编辑 2 基于 Jeff Y 在下面的第二条评论

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

标签: regexelasticsearchlogstashkibanalogstash-grok

解决方案


Grok 将针对整个消息测试您的模式。

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

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


推荐阅读