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

grok parse optional field pattern doesn't work

我有这样的日志:

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 它 "eats" 尽可能多地填充 errormessage.

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

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

我使用 @Skeeve 's 得到了答案。

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

我使用了自定义模式以避免 GREEDYDATA(对于 errorMessage 字段)吃得过多。

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