1

我有一个使用定义的 slf4j XML 格式编写的日志文件。有没有办法编写脚本,输入 XML 格式文件,然后解析其中包含的消息?

示例输出:

2012-10-11 16:53:25.895 [main] {} INFO  org.mortbay.log - jetty-6.1.11
2012-10-11 16:53:26.097 [main] {} INFO  / - Initializing Spring root WebApplicationContext

我想创建一个输出文件(如 csv),该文件将根据 XML 中的定义由列分隔:

<encoder>
    <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] {%mdc} %-5level %logger{36} - %msg%n</pattern>
</encoder>

任何帮助/指针将不胜感激!

谢谢!

4

2 回答 2

2

当然,在 Perl 中有很多读取 XML 文件的方法,包括XML::ParserXML::LibXML

我将从 XML::Parser 开始。XML::LibXML 从长远来看似乎更好,但我觉得 XML::Parser 更舒服。

编辑:既然你已经编辑了你的问题,我发现我的回答是不够的。显然,获取模式(您可能需要上述 XML 模块或只是一个简单的正则表达式)将不是问题。不幸的是,我不知道该模式可能的格式选项,它们似乎很复杂。

您想根据可以应用于每一行的模式创建一个正则表达式。

在这种特定情况下,正则表达式看起来像这样:

(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}:\d{2}.\d{3})\s\[(.*?)\]\s\{(.*?)\}\s(.*?*) - (.*)(\d*)

由于我知道 Perl,但不知道消息格式,我只能猜测。我假设 slf4j 中的格式化原子遵循该模式%-?\w+(\{.*?\}|)——即百分号、可选的减号、字母数字字符,然后,可选地,花括号中的一些额外的格式化选项。

鉴于您设法解析 XML 格式化指令并成功地将模式提取到变量$pattern中,您现在执行以下操作:

$pattern =~ s/%-?\w+(\{.*?\}|)/(.*?)/g

应用于您的示例模式,这将产生以下正则表达式:

(.*?) [(.*?)] {(.*?)} (.*?) (.*?) - (.*?)(.*?)

您可以将其与日志文件的每一行进行匹配:

@parsed = ( $line =~ /$pattern/ )

这还不完美,会失败;你应该识别日期格式,并区分 %n 和 %msg (我假设 %n 只能包含数字,如果不是,你有问题)。但是,您会看到这是怎么回事。希望有帮助。

于 2012-10-12T08:18:11.287 回答
0

我不太确定我是否理解您的问题,但是PerlLog::Log4perl有一个Log4j 实现

我认为可以使用来自 Log4j 的配置文件

于 2012-10-12T08:28:00.020 回答