我有一个使用已定义的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>
任何帮助/指针都会非常感激!
谢谢!
答案 0 :(得分:2)
当然,有plenty of ways在Perl中读取XML文件,包括XML::Parser和XML::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只能包含数字,否则,你有问题)。但是,你会看到它的发展方向。希望有所帮助。
答案 1 :(得分:0)
我不太清楚我理解你的问题,但Log::Log4perl
是 Loglj实现Perl
我认为可以使用Log4j中的配置文件