logstash 中的 grok 正则表达式解析和提取字段
grok regex in logstash to parse and extract field
我正在尝试从单个消息字段中提取某些字段。我试图通过 logstash 上的 grok regex 来实现这一点,以便我可以在 kibana 中查看它们。
我的日志事件如下:
[2021-01-06 12:10:40] ApiLogger.INFO: API log data: {"endpoint":"/rest/thre_en/V1/temp-carts/13cEIQqUb6cUfxB/tryer-inform","http_method":"GET","payload":[],"user_id":0,"user_type":4,"http_response_code":200,"response":"{\"pay_methods\":[{\"code\":\"frane\",\"title\":\"R2 Partial redeem\"}],\"totals\":{\"grand_total\":0,\"base_grand_total\":0}}
整个日志有更多的信息进入不同的键值存储-
基本上,我需要这些信息 -
- 时间戳(我能得到这个)
- 日志级别(我能够得到这个)=> 在日志级别,我只想要信息而不是整个 Api.INFO
- 端点
- http 方法
- user_id
- user_type
- http_response_code
- 回应
我无法从 3-8 获取信息...我已经测试过了。这是由于分号(:)
这是我通过 grok 调试器尝试的
%{SYSLOG5424SD:logtime} %{JAVACLASS:loglevel}: (?<API>\w+ \w+ \w+):
我尝试了 uri 和其他但它没有用,可能是由于冒号。
你可以使用
%{SYSLOG5424SD:logtime} ApiLogger.%{LOGLEVEL:loglevel}: (?<API>\w+ \w+ \w+):\s*%{GREEDYDATA:json_field}
然后,您可以将 json_field
解析为 JSON filter。
如果你想玩正则表达式,你应该记住正则表达式引擎默认从左到右解析字符串。如果你想用一个正则表达式捕获多个字段,你应该确保正则表达式引擎可以从一个部分一直“走”到另一个部分。如果你知道有什么模式,两者之间有什么类型的字符,那就太好了。如果没有,您只能依赖 .*
(%{GREEDYDATA}
) 或 .*?
(%{DATA}
) 模式。
所以,作为练习,您可以看看
%{SYSLOG5424SD:logtime} %{JAVACLASS:loglevel}: (?<API>\w+ \w+ \w+):\s*\{"endpoint":"(?<endpoint>[^"]*)","http_method":"(?<http_method>[A-Z]++).*?"user_id":(?<user_id>[0-9]++).*?"user_type":(?<user_type>[0-9]++).*?"http_response_code":(?<http_response_code>[0-9]++).*?"response":"(?<response>.*)"
检查每个字段之间 [0-9]++
和 .*?
中的 ++
模式。 ++
possessive 量词确保引擎不会在后续模式匹配失败时再次尝试与量词修改的模式进行匹配。 [0-9]++
获取一个数字序列并且不会泄露它们,如果后续模式失败,则整个匹配失败。 .*?
只匹配除换行字符以外的任何零个或多个字符,尽可能少。最后一个 .*
是贪心的,因为它必须匹配 许多 个字符,而不是换行字符。
参见regex demo。
我正在尝试从单个消息字段中提取某些字段。我试图通过 logstash 上的 grok regex 来实现这一点,以便我可以在 kibana 中查看它们。
我的日志事件如下:
[2021-01-06 12:10:40] ApiLogger.INFO: API log data: {"endpoint":"/rest/thre_en/V1/temp-carts/13cEIQqUb6cUfxB/tryer-inform","http_method":"GET","payload":[],"user_id":0,"user_type":4,"http_response_code":200,"response":"{\"pay_methods\":[{\"code\":\"frane\",\"title\":\"R2 Partial redeem\"}],\"totals\":{\"grand_total\":0,\"base_grand_total\":0}}
整个日志有更多的信息进入不同的键值存储- 基本上,我需要这些信息 -
- 时间戳(我能得到这个)
- 日志级别(我能够得到这个)=> 在日志级别,我只想要信息而不是整个 Api.INFO
- 端点
- http 方法
- user_id
- user_type
- http_response_code
- 回应
我无法从 3-8 获取信息...我已经测试过了。这是由于分号(:)
这是我通过 grok 调试器尝试的
%{SYSLOG5424SD:logtime} %{JAVACLASS:loglevel}: (?<API>\w+ \w+ \w+):
我尝试了 uri 和其他但它没有用,可能是由于冒号。
你可以使用
%{SYSLOG5424SD:logtime} ApiLogger.%{LOGLEVEL:loglevel}: (?<API>\w+ \w+ \w+):\s*%{GREEDYDATA:json_field}
然后,您可以将 json_field
解析为 JSON filter。
如果你想玩正则表达式,你应该记住正则表达式引擎默认从左到右解析字符串。如果你想用一个正则表达式捕获多个字段,你应该确保正则表达式引擎可以从一个部分一直“走”到另一个部分。如果你知道有什么模式,两者之间有什么类型的字符,那就太好了。如果没有,您只能依赖 .*
(%{GREEDYDATA}
) 或 .*?
(%{DATA}
) 模式。
所以,作为练习,您可以看看
%{SYSLOG5424SD:logtime} %{JAVACLASS:loglevel}: (?<API>\w+ \w+ \w+):\s*\{"endpoint":"(?<endpoint>[^"]*)","http_method":"(?<http_method>[A-Z]++).*?"user_id":(?<user_id>[0-9]++).*?"user_type":(?<user_type>[0-9]++).*?"http_response_code":(?<http_response_code>[0-9]++).*?"response":"(?<response>.*)"
检查每个字段之间 [0-9]++
和 .*?
中的 ++
模式。 ++
possessive 量词确保引擎不会在后续模式匹配失败时再次尝试与量词修改的模式进行匹配。 [0-9]++
获取一个数字序列并且不会泄露它们,如果后续模式失败,则整个匹配失败。 .*?
只匹配除换行字符以外的任何零个或多个字符,尽可能少。最后一个 .*
是贪心的,因为它必须匹配 许多 个字符,而不是换行字符。
参见regex demo。