我需要通過關鍵字從logfile中grep完整的stacktrace。perl通過關鍵字尋找Java StackTrace的正則表達式關鍵字
此代碼工作正常,但在大文件上減慢(超過文件慢)。 我認爲提高正則表達式以找到關鍵字的最好方法,但我無法完成。
#!/usr/bin/perl
use strict;
use warnings;
my $regexp;
my $stacktrace;
undef $/;
$regexp = shift;
$regexp = quotemeta($regexp);
while (<>) {
while ($_ =~ /(?<LEVEL>^[E|W|D|I])\s
(?<TIMESTAMP>\d{6}\s\d{6}\.\d{3})\s
(?<THREAD>.*?)\/
(?<CLASS>.*?)\s-\s
(?<MESSAGE>.*?[\r|\n](?=^[[E|W|D|I]\s\d{6}\s\d{6}\.\d{3}]?))/gsmx) {
$stacktrace = $&;
if ($+{MESSAGE} =~ /$regexp/) {
print "$stacktrace";
}
}
}
用法:./grep_log4j.pl <pattern> <file>
例子:./grep_log4j.pl Exception sample.log
我覺得問題在$stacktrace = $&;
,因爲如果刪除該字符串,並簡單地打印所有匹配的行腳本工作快。 腳本的版本打印所有比賽:
#!/usr/bin/perl
use strict;
use warnings;
undef $/;
while (<>) {
while ($_ =~ /(?<LEVEL>^[E|W|D|I])\s
(?<TIMESTAMP>\d{6}\s\d{6}\.\d{3})\s
(?<THREAD>.*?)\/
(?<CLASS>.*?)\s-\s
(?<MESSAGE>.*?[\r|\n](?=^[[E|W|D|I]\s\d{6}\s\d{6}\.\d{3}]?))/gsmx) {
print_result();
}
}
sub print_result {
print "LEVEL: $+{LEVEL}\n";
print "TIMESTAMP: $+{TIMESTAMP}\n";
print "THREAD: $+{THREAD}\n";
print "CLASS: $+{CLASS}\n";
print "MESSAGE: $+{MESSAGE}\n";
}
用法:./grep_log4j.pl <file>
實施例:./grep_log4j.pl sample.log
Lo4j圖案:%-1p %d %t/%c{1} - %m%n
日誌文件的實施例:
I 111012 141506.000 thread/class - Received message: something
E 111012 141606.000 thread/class - Failed handling mobile request
java.lang.NullPointerException
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at java.lang.Thread.run(Thread.java:619)
W 111012 141706.000 thread/class - Received message: something
E 111012 141806.000 thread/class - Failed with Exception
java.lang.NullPointerException
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at java.lang.Thread.run(Thread.java:619)
D 111012 141906.000 thread/class - Received message: something
S 111012 142006.000 thread/class - Received message: something
I 111012 142106.000 thread/class - Received message: something
I 111013 142206.000 thread/class - Metrics:0/1
我的正則表達式,你可以通過關鍵字的log4j上找到http://gskinner.com/RegExr/:
一般而言,您應該避免使用'$&' - 請參閱'perldoc perlre'中的'WARNING'。在您的程序中使用它會導致速度損失。 – ErikR