0

我的(现有)perl 文件使用以下格式的 Log4Perl 创建日志文件

[2011-11-21 08:50:22,406] States_Sync INFO Logger.pm:33 script starts
[2011-11-21 08:50:22,610] States_Sync ERROR Logger.pm:36 Error occurred ....
[2011-11-21 08:50:22,406] States_Sync INFO Logger.pm:33 ...
[2011-11-21 08:50:22,610] States_Sync ERROR Logger.pm:36 Error occurred ....
[2011-11-21 08:50:22,406] States_Sync INFO Logger.pm:33 ...
[2011-11-21 08:50:22,610] States_Sync ERROR Logger.pm:36 Error occurred ....

以上只是我的日志文件的一个例子。我使用以下格式化程序

$layout = Log::Log4perl::Layout::PatternLayout->new("[%d{ISO8601}] %c %p %F{1}:%L %m%n");

目前我必须发送电子邮件以防出错。

我没有修改现有脚本,而是考虑仅针对错误解析生成的日志文件,并将日志文件中与“错误”相关的所有消息作为电子邮件发送

有没有简单的方法来解析日志文件?

问候,

卡尔提克

4

4 回答 4

3

使用 grep(1):

grep ERROR log.file

或使用 perl:

perl -ne 'print if /ERROR/' log.file
于 2011-12-12T14:02:58.520 回答
1

我可以试试这个:

if ( /^[^:]+?\s+ERROR\s/ ) {
    # pull fields
    # send email
}

试试那个,看看它是否给你太多的行。更详细的版本可能是:

if ( /^\[\d{4}-\d\d-\d\d \d\d:\d\d:\d\d,\d{3}\]\s+([\w\s])?\s+ERROR\s+/ ) {

但前提是数据更复杂。

于 2011-12-12T14:01:09.567 回答
0

由于您使用的是 log4perl,因此您可以使用那里的内置方法来检查错误(或以上错误)并基于此发送电子邮件。

if ($layout->is_error()){
  # Put e-mail logic here
}

如果您只想要错误信息而不想要警告、信息、调试或跟踪,您可以执行以下操作:

if($layout->is_error() && ! $layout->is_warn()){
  # Put e-mail logic here
}
于 2011-12-12T14:11:50.570 回答
0

您没有指定检查日志文件和发送电子邮件的频率。如果每天一次,那么 tadmc 提供的解决方案将是您最好的选择。

但是,如果您想自动化它并在特定时间间隔(请参阅 maxinterval)后为遇到的每个新 ERROR 条目发送电子邮件,您可能需要检查以下内容。

注意#1根据您的要求调整间隔和最大间隔,以免电子邮件淹没人们注意#2根据您的日志轮换间隔运行它

#!/usr/bin/perl

use strict;
use warnings;
use File::Tail;

my @logs_to_email;
my $log_file = "file.log";

my $error_pattern = qr(^\[.*?\]\s*States_Sync\s*ERROR);

my $tail = File::Tail->new(
        name => $log_file,
        maxinterval => 60,
        interval => 10,
        adjustafter => 10,
);

while (defined (my $line = $tail->read)) {
        chomp $line;
        next if $line =~ /^\s*$/;
        next unless $line =~ $error_pattern;
        push @logs_to_email, $line;
        ##
        ##  put e-mail logic to send
        ##    @logs_to_email here
        ##
}
于 2011-12-15T08:31:53.430 回答