正则表达式解析log4j日志格式

问题描述 投票:0回答:1

有没有可以解析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/ 上尝试了几个正则表达式,但正则表达式对于多行事件一直失败

java regex log4j splunk
1个回答
0
投票

如果您想解析日志文件,请使用结构化日志格式,例如

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"/>

如果您使用这样的模式,每个事件都将位于单独的行上,并且您可以使用正则表达式组至少解析时间戳。

© www.soinside.com 2019 - 2024. All rights reserved.