grok解析可选字段模式无效

时间:2019-06-14 04:56:50

标签: regex logstash logstash-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
    ]
  ]
}

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

2 个答案:

答案 0 :(得分:1)

自从您使用GREEDYDATA以来,它就“尽其所能”地填充errormessage

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

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

答案 1 :(得分:1)

我使用@Skeeveidea得到了答案。

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

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

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