我的正则表达式无法匹配日志消息。我们正在使用 log4net,我想按 timestamp、level、logger 和 message 分组。问题是我们使用分号来分隔组,有时消息也包含分号。
日志文件中的示例条目:
2023-02-24 10:06:41,903;WARN;Request.Apply.Locked;business.Validator;Waiting X to continue
(工作)2023-02-24 10:06:41,903;WARN;Request.Apply.Locked;business.Validator;Framework;<METADATA>Waiting X to continue</METADATA>
(不工作)正则表达式链接:
如您所见,第二个链接将“/METADATA>”分组为消息。
问题是我不知道message中有多少个分号。但是,我知道在logger中它可以是1-3个分号。是否可以编写 RegEx 来匹配/忽略最多 3 个分号?
正如您在下面的示例中看到的,logger 将以这样的分号开始和结束:
;Request.Apply.Locked;business.Validator;Framework;Test;
我们有 5 个分号,但其中 3 个应该属于 logger 组。
日志可以这么长:
2023-02-24 10:06:41,903;WARN;Request.Apply.Locked;business.Validator;Framework;Test;<METADATA>Waiting X to continue</METADATA>
这是我当前的正则表达式:
(?<timestamp>[\d-]+ [\d:,]+);(?<level>[A-Z]+)\s?;?\s?\s?(?<logger>[\s\S]*);(?<message>[\s\S]*)
总结一下:我想要一个正则表达式来对timestamp、level、logger、message进行分组,它应该适用于示例1和示例2。
提前致谢。
尝试使用
m
正则表达式修饰符分别匹配行首和行尾的 ^
和 $
。然后让最后一次捕获寻找任何东西 except 一个分号。
^(?<timestamp>[\d-]+ [\d:,]+);(?<level>[A-Z]+)\s?;?\s?\s?(?<logger>[\s\S]*);(?<message>[^;]+)$
适用于上面的示例 1. 和 2.