Perl程序通过错误日志文件解析,提取错误消息并输出到新文件

时间:2015-04-25 20:08:57

标签: regex perl

我需要编写一个perl程序,我在其中解析错误日志并将错误消息输出到新文件。我在设置正则表达式时遇到问题。在错误日志中,错误代码以单词" ERROR"开头。并且每个错误消息的结尾以"结束。 " (期间然后是空间)。我想查找所有错误,计算它们,并将每条错误消息的整个错误消息输出到新文件。

我试过了,但遇到了问题:

open(FH,"<$filetoparse");

    $outputfile='./errorlog.txt';
    open(OUTPUT,">$outputfile");
    $errorstart='ERROR';
    $errorend=". ";

    while(<FH>)
    {
    if (FH=~ /^\s*$errorstart/../$errorend/)   
    {
        print OUTPUT "success";
    }   
    else
    {
        print OUTPUT "failed";
    }
    }

}
$ errorstart和$ errorend是我在网上看到的,我不确定这是否是正确的编码方式。

我也知道印刷&#34;成功&#34;或&#34;失败&#34;不是我说的我想要的,我补充说,为了帮助确认代码有效,我还没有尝试编码来计算错误信息。

在此代码片段之前,我有一个print语句,询问用户要解析的.txt文件的位置地址。我正确地确认了特定部分的代码字。谢谢你的帮助!如果需要更多信息,请告诉我们!

以下是我将使用的数据示例:

样本数据

-----开始负荷-----
成功:文件加载正确。
成功:文件加载正确。
成功:文件加载正确。
成功:文件加载正确。
成功:文件加载正确。
成功:文件加载正确。
错误:由于未知原因,文件无法加载 成功:文件加载正确。
成功:文件加载正确。
错误:文件无法加载这只是一个跨越日志文件的示例 多行。
成功:文件加载正确。
------ END LOAD -------

虽然日志可能不一定需要跨越多行,但整个日志中会有一些数据与上面的数据类似。记录的每条消息都以SUCCESS或ERROR开头,消息在&#34; 。 &#34; (遇到whitespace-period-whitespace)。我要解析的日志是50,000个条目,所以不用说我想编码所以它还会识别多行错误消息以及将整个多行消息输出到输出文件。

更新

我已编写代码但由于某种原因它无法工作。我认为这与分隔符有关,但我无法弄清楚它是什么。我正在使用的文件的消息由&#34;空白句号换行符#34;分隔。你能看出我做错了什么吗?

{
local $/ = " .\n";
if ($outputtype == 1)
{
    $outputfile="errorlog.txt";
    open(OUTPUT,">>$outputfile");
    $errorcount=0;
    $errortarget="ERROR";
    print OUTPUT "-----------Error Log-----------\n";
    {
    while(<FH>)
    {
    if ($_ =~ m/^$errortarget/)
    {
        print OUTPUT "$_\n";
        print OUTPUT "next code is: \n";
        $errorcount++;
    }
    }
    print OUTPUT "\nError Count : $errorcount\n";
    }
}
}

1 个答案:

答案 0 :(得分:4)

您的代码有几个问题可以启动。

  • 始终use strict;use warnings;
  • 3参数open更不容易出错。 open ( my $fh, "<", $filename ) or die $!;
  • 始终检查open确实有效。
  • FH =~不符合您的想法。
  • 范围运算符测试,如果您在代码中的两个文本块之间。这对于多线操作尤其重要。如果您的错误日志不是,那么它不是您需要的。

假设你有这样的错误数据:

ERROR: something is broken.
WARNING: something might be broken.
INFO: not broken.
ERROR: still broken.

这段代码可以解决问题:

use strict;
use warnings;

my $filetoparse = "myfile.txt";
my $outputfile  = "errorlog.txt";

open( my $input,  "<", $filetoparse ) or die $!;
open( my $output, ">", $outputfile )  or die $!;

my $count_of_errors = 0;
#set record delimiter
local $/ = " . \n";

while ( my $lines = <$input> ) {
    $lines =~ s/^-----\w+ LOAD-----\n//g; #discard any 'being/end load' lines. 
    if ( $lines =~ m/^ERROR/ ) {
        $count_of_errors++;
        print {$output} $lines;
    }
}
close ( $input );
close ( $output );

print "$count_of_errors errors found\n";

如果您有多行错误消息,那么您需要稍微不同的方法。