如何用Logstash与正则表达式提取日志请求响应数据?正则匹配求助
正则匹配日志问题求助
我有一份包含应用请求与响应的日志文件,尝试了多种正则表达式模式但均未匹配到内容,恳请给出修改建议。
原正则模式
(?m)\b\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3}\b.?\bRequest given by the user\b.?\brspDesc is\b(?!.\n)..?(?=\R|$)
日志示例
2023-05-11 00:20:26,103 [http-apr-7777-exec-46] INFO com.welcome.ws.AccountWebServiceImpl. - Request given by the user <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ns2:GetCustomerBalanceReq xmlns="url" xmlns:ns2="url"> testt ** xls ns2:ID/EID/5000000004/123456****1234</ns2:ID> </ns2:GetCustomerBalanceReq> 2023-05-11 00:20:26,144 [http-apr-7777-exec-46] INFO com.welcome.svc.AccountService. - rspCode is:1001 and rspDesc is:Account or Media does not Exist
问题分析
原正则存在几个关键问题:
.?仅能匹配单个任意字符,无法跨越请求行与rspDesc行之间的大量换行和内容(?!.\n)负前瞻逻辑无效,且..?最多匹配2个字符,完全无法覆盖中间的日志内容- 多行模式
(?m)仅改变^和$的匹配范围,不影响.对换行的处理,导致无法跨行匹配
修改建议
1. 匹配完整请求-响应块并提取rspDesc内容
使用单行模式(?s)让.匹配换行符,结合非贪婪匹配跨越中间内容:
(?s)\b\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3}\b.*?Request given by the user.*?rspDesc is:(.*?)(?=\R|$)
(?s):开启单行模式,.可匹配换行.*?:非贪婪匹配任意字符,避免过度匹配- 捕获组
(.*?)提取rspDesc后的具体描述
2. 仅提取rspDesc的描述文本
如果只需要rspDesc的内容,可简化为:
rspDesc is:(.*?)(?=\s|$)
内容的提问来源于stack exchange,提问作者Hamzeh Abu Ajamieh
相关产品推荐
相关产品推荐

