我有这样的日志:
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})?