我试图从单个消息字段中提取某些字段。我正试图实现这一点,通过在逻辑仓库上的摸索正则表达式,这样我就可以在基巴纳看到它们。
我的日志事件如下所示:[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}}
整个日志有更多的信息进入不同的键值存储-基本上,我需要这些信息-
我无法从3-8得到信息.我测试过了。这是由于分号(:)--这是我通过grok调试器%{SYSLOG5424SD:logtime} %{JAVACLASS:loglevel}: (?<API>\w+ \w+ \w+):所做的尝试
我试了uri和其他,但它没有工作,可能是由于结肠。
发布于 2021-01-08 09:42:34
您可以使用
%{SYSLOG5424SD:logtime} ApiLogger.%{LOGLEVEL:loglevel}: (?<API>\w+ \w+ \w+):\s*%{GREEDYDATA:json_field}然后,您可以使用json_field解析JSON滤波器。
如果您想玩regex,您应该记住regex引擎默认从左到右解析字符串。如果您想用一个正则表达式捕获几个字段,您应该确保regex引擎可以从一个部分“走”到另一个部分。如果你知道这两者之间有什么模式,有什么类型的字符,那就太棒了。否则,只能依赖.* (%{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]++和.*?模式中的.*?。如果后续模式不匹配,++拥有式量词确保引擎不会重试与量化符再次修改的模式匹配。[0-9]++抓取一个数字序列,不给出它们,如果后续模式失败,整个匹配失败。.*?只需匹配除行中断字符以外的任何零个或多个字符,尽可能少。最后一个.*是贪婪的,因为它必须匹配尽可能多的字符,而不是行中断字符。
见regex演示。
https://stackoverflow.com/questions/65600601
复制相似问题