我有一个使用定义的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>任何帮助/指示都将不胜感激!
谢谢!
发布于 2012-10-12 16:18:11
当然,在Perl中有读取XML文件的plenty of ways,包括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只能包含数字,如果不包含,则有问题)。但是,您会看到这是怎么回事。希望这能有所帮助。
发布于 2012-10-12 16:28:00
我不太确定我是否理解了您的问题,但是有一个Log::Log4perl,它是针对Perl的Log4j实现。
我认为这可以使用Log4j中的配置文件
https://stackoverflow.com/questions/12854844
复制相似问题