使用带有多个分号的RegEx对日志消息进行分组

whhtz7ly  于 2023-02-25  发布在  其他
关注(0)|答案(2)|浏览(107)

我的RegEx在匹配日志消息时遇到问题。我们使用的是log 4 net,我想按 * 时间戳 级别 日志记录器 * 和 * 消息 * 分组。问题是我们使用分号分隔这些组,有时消息也包含分号。
日志文件中的条目示例:

  1. 2023-02-24 10:06:41,903;WARN;Request.Apply.Locked;business.Validator;Waiting X to continue(工作)
  2. 2023-02-24 10:06:41,903;WARN;Request.Apply.Locked;business.Validator;Framework;<METADATA&gtWaiting X to continue</METADATA&gt(不工作)
    RegEx链接:
  3. https://regex101.com/r/E97VkI/1(工作)
  4. https://regex101.com/r/n6Um82/1(不工作)
    如您所见,第二个链接将“/METADATA&gt”分组为消息。
    问题是我不知道 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&gtWaiting X to continue</METADATA&gt
    以下是我当前的RegEx:
    (?<timestamp>[\d-]+ [\d:,]+);(?<level>[A-Z]+)\s?;?\s?\s?(?<logger>[\s\S]*);(?<message>[\s\S]*)

**总结一下:**我想让一个RegEx对 timestamplevelloggermessage 进行分组,它应该对示例1和示例2都有效。

先谢了。

qlvxas9a

qlvxas9a1#

您可以使用量词和取反字符类匹配前导;,然后在其间匹配0 - 2个匹配项,最后匹配结尾;

(?<timestamp>[\d-]+ [\d:,]+);(?<level>[A-Z]+)\s*;\s*(?<logger>(?:[^;\n]*;){0,2}[^;\n]*);(?<message>.*)
    • 说明**
  • (?<timestamp>[\d-]+ [\d:,]+);组 * 时间戳 *
  • (?<level>[A-Z]+)组 * 级别 * 匹配1+字符A-Z
  • \s*;\s*在可选空白字符之间匹配;(您也可以匹配换行符)
  • (?<logger>组 * 记录器 *
  • (?:[^;\n]*;){0,2}对除;以外的任何字符重复0 - 2次,然后匹配;
  • [^;\n]*匹配除;或换行符以外的可选字符
  • );关闭组 * 记录器 * 并匹配;
  • (?<message>.*)与该行其余部分匹配的组 * 消息 *

参见regex demo
或者,如果&lt;不应是记录器的一部分:

(?<timestamp>[\d-]+ [\d:,]+);(?<level>[A-Z]+)\s*;\s*(?<logger>(?:(?!&[lg]t;).)*);(?<message>.*)

查看其他regex demo

soat7uwm

soat7uwm2#

尝试使用m正则表达式修饰符来匹配行首和行尾的^$,然后在最后一个捕获中查找任何内容,* 除了 * 分号。

^(?<timestamp>[\d-]+ [\d:,]+);(?<level>[A-Z]+)\s?;?\s?\s?(?<logger>[\s\S]*);(?<message>[^;]+)$

它适用于上述示例1和2。

相关问题