繁体   English   中英

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因此它会尽可能多地“吃掉”它以填充errormessage

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

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

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

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

为了避免过多吃掉GREEDYDATA (用于errorMessage字段),我使用了自定义模式。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM