有没有可以解析log4j日志格式的正则表达式?特别考虑java异常等多行事件?
例如
2023-08-31 00:10:52,734 main INFO FileManager cool
2023-08-31 00:10:52,734 main INFO FileManager bean
2023-08-31 00:10:52,734 main ERROR FileManager java.io.FileNotFoundException: (No such file or directory) java.io.FileNotFoundException: (No such file or directory)
at java.base/java.io.FileOutputStream.open0(Native Method)
at java.base/java.io.FileOutputStream.open(FileOutputStream.java:298)
at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:237)
at org.apache.logging.log4j.core.appender.FileManager$FileManagerFactory.createManager(FileManager.java:438)
at org.apache.logging.log4j.core.appender.FileManager$FileManagerFactory.createManager(FileManager.java:422)
at org.apache.logging.log4j.core.appender.AbstractManager.getManager(AbstractManager.java:144)
2023-08-31 00:10:52,734 main INFO FileManager foobar
我在 https://regex101.com/ 上尝试了几个正则表达式,但正则表达式对于多行事件一直失败
JsonTemplateLayout
、Rfc5424Layout
或 XmlLayout
提供的格式。
非结构化布局被认为是供人类使用的,而不是机器使用的。假设您使用的是带有
%d %t %p %c %m%n
模式的模式布局(如果您未在布局中指定 %xEx
,则会附加隐式 alwaysWriteExceptions="false"
):
%t
)、级别 (%p
)、记录器名称 (%c
) 等模式可扩展为由应用程序开发人员选择的任意字符串。所以它们匹配.*
。通常它们不包含换行符,但它们可以。%m
模式通常包含一些用户生成的数据,因此恶意用户可以在那里插入任意文本。%xEx
模式包含异常消息,因此它再次由开发人员选择。解析模式布局产生的日志的主要问题是无法确定一个日志事件何时结束、另一个日志事件何时开始。您可以通过转义换行来解决这个问题:
<PatternLayout pattern="%d %enc{%t %p %m%n%xEx}"
alwaysWriteExceptions="false"/>
如果您使用这样的模式,每个事件都将位于单独的行上,并且您可以使用正则表达式组至少解析时间戳。