grok 解析可选字段模式不起作用



我有这样的日志:

ERROR_MESSAGE:Invalid Credentials,THROTTLED_OUT_REASON:API_LIMIT_EXCEEDED

我正在尝试使用 grok 调试器用 grok 解析它:

ERROR_MESSAGE:%{GREEDYDATA:errorMassage},THROTTLED_OUT_REASON:%{GREEDYDATA:throttledOutReason}

它可以工作,但有时日志没有THROTTLED_OUT_REASON字段。

ERROR_MESSAGE:%{GREEDYDATA:errorMassage}

在这种情况下,我尝试了以下代码,因为THROTTLED_OUT_REASON是一个可选字段。

ERROR_MESSAGE:%{GREEDYDATA:errorMassage}(,THROTTLED_OUT_REASON:%{GREEDYDATA:throttledOutReason})?

所以这应该适用于这两种情况。带有可选字段的日志的给定输出为:

{
  "errorMassage": [
    [
      "Invalid Credentials,THROTTLED_OUT_REASON:API_LIMIT_EXCEEDED"
    ]
  ],
  "throttledOutReason": [
    [
      null
    ]
  ]
}

但是带有可选字段的日志的预期输出:

{
  "errorMassage": [
    [
      "Invalid Credentials"
    ]
  ],
  "throttledOutReason": [
    [
      "API_LIMIT_EXCEEDED"
    ]
  ]
}

不带可选字段的日志的预期输出:

{
  "errorMassage": [
    [
      "Invalid Credentials"
    ]
  ],
  "throttledOutReason": [
    [
      null
    ]
  ]
}

任何人都可以提出一种为两种类型的日志提供正确输出的解决方案吗?

由于您使用GREEDYDATA它尽可能多地"吃"以填饱errormessage

我对 GROK 的了解不足以告诉您有哪些替代定义的模式,但您应该能够使用自定义模式:

ERROR_MESSAGE:(?<errorMassage>.*?),THROTTLED_OUT_REASON:%{GREEDYDATA:throttledOutReason}

我用@Skeeve的想法得到了答案。

这是给任何想出类似问题的人的:

我使用了自定义模式,以避免过量食用GREEDYDATA(对于errorMessage字段(。

ERROR_MESSAGE:(?<errorMassage>([^,]*)?)(,THROTTLED_OUT_REASON:%{GREEDYDATA:throttledOutReason})?

相关内容

  • 没有找到相关文章

最新更新