用于解析slf4j格式日志文件的Perl脚本

用于解析slf4j格式日志文件的Perl脚本,perl,slf4j,Perl,Slf4j,我有一个日志文件,正在使用定义的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 我想创建一个输出文件(如cs

我有一个日志文件,正在使用定义的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>

%d{yyyy-MM-dd HH:MM:ss.SSS}[%thread]{%mdc}%-5级%logger{36}-%msg%n
如有任何帮助/建议,将不胜感激

谢谢大家!

当然,在Perl中读取XML文件有很多方法,包括和

我将从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+(\{.*.\}\124;)
——即百分号、可选减号、字母数字字符,然后可选地使用大括号中的一些附加格式化选项

假设您成功地解析了XML格式说明并成功地将模式提取到变量
$pattern
,现在可以执行以下操作:

$pattern =~ s/%-?\w+(\{.*?\}|)/(.*?)/g
应用于示例模式,将生成以下正则表达式:

(.*?) [(.*?)] {(.*?)} (.*?) (.*?) - (.*?)(.*?)
您可以将其与日志文件的每一行进行匹配:

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

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

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


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

OP只想解析日志文件slf4j;我认为Log::Log4perlI不可能让应用程序使用slf4j编写日志文件-最后,我想创建一个进程(最好是Perl,它将读取该日志文件,并创建一个单独的csv文件)(csv更易于“客户”读取-我将对消息进行更多的正则表达式解析,等等)感谢您对正则表达式模式的关注,我们遇到的问题是输出的%msg%部分混乱/跨越多行。Ex/2012-10-11 16:53:25.734[main]{}WARN c.x.d.p.a.reflect.PropertyDescriptor-布尔属性www.PublishedWebContent.restartRequired不应该是必需的。2012-10-11 16:53:25.735[main]{}WARN c.x.d.p.a.reflect.PropertyDescriptor-布尔属性www.ApacheConfFragment.restartRequired不应是必需的。2012-10-11 16:53:25.742[main]{}WARN c.x.d.p.a.reflect.PropertyDescriptor-布尔属性overthere.Host.tmpDeleteOnDisconnect不应是必需的。然后在行端使用匹配。