Разбор помощи в Perl - PullRequest
       29

Разбор помощи в Perl

0 голосов
/ 12 декабря 2011

Мои (существующие) 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 ]

3 голосов
/ 12 декабря 2011

используйте grep (1):

grep ERROR log.file

или используйте perl:

perl -ne 'print if /ERROR/' log.file
1 голос
/ 12 декабря 2011

Я мог бы попробовать это:

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+/ ) {

, но только если данные были более сложными.

0 голосов
/ 15 декабря 2011

Вы не указали, как часто вам нужно проверять файл журнала и отправлять электронные письма.Если это происходит один раз в день, то лучшим решением будет решение, предоставленное 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
        ##
}
0 голосов
/ 12 декабря 2011

Поскольку вы используете log4perl, вы можете использовать встроенные методы для проверки на наличие ОШИБКИ (или выше) и отправки электронного письма на основании этого.

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

И если выТребуется только информация об ошибке, а не предупреждение, информация, отладка или трассировка. Вы можете сделать следующее:

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