Как читать постоянно обновляемый файл журнала и сопоставлять определенный шаблон в скрипте Perl - PullRequest
0 голосов
/ 23 апреля 2019

Я хочу прочитать постоянно обновляемый файл журнала.Если я получу определенный шаблон, тогда я смогу отправить письмо, которое я могу сделать.

use strict;
use warnings;
my $line;
my $to = 'abc@abc.com';
my $from = 'xyz@abc.com';
my $subject = 'Connection Pool Issue';
my $message = 'There is connection pool issue. Please check Logs for more details';

open my $fh, '<', 'error.txt';
my @file = <$fh>;
close $fh;

foreach my $line (@file) {


 if ($line =~ /The connection is closed./) 

 { 

    open(MAIL, "|/usr/sbin/sendmail -t");
    print MAIL "To: $to\n";
    print MAIL "From: $from\n";
    print MAIL "Subject: $subject\n\n";
    # Email Body
    print MAIL $message;

    close(MAIL);
    print "Email Sent Successfully\n";

    last;
  }
}

Я не хочу читать файл из обработчика файлов 0, то есть из начальной позиции.

Я ожидаю прочитать файл из текущей позиции обработчика файла.Он не должен включать уже прочитанные строки.

Пожалуйста, предложите.Спасибо

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Использование Файл :: Хвост .

use File::Tail qw( );

my $tail = File::Tail->new( name => $qfn );
while (defined( my $line = $tail->read() )) {
   if ($line =~ /The connection is closed\./) {
      ...
   }
}

Если вам нужны предыдущие строки,

use File::Tail qw( );

my $tail = File::Tail->new( name => $qfn );
my @buf;
while (defined( my $line = $tail->read() )) {
   push @buf, $line;
   if ($line =~ /The connection is closed\./) {
      ...
      @buf = ();
   }
}
0 голосов
/ 23 апреля 2019

Я решил эту проблему двумя различными способами.

Без модулей вы можете сделать что-то вроде:

-Check if line count file exists and read into variable
-loop through file line by line, increment counter
-if $loop_line_count < $line_count_previous_run : skip
-if $total_line_count < $line_count_previous_run : reset file count to 0
-write total_line_count to file

С File :: Tail

my $file=File::Tail->new( name=>"$log_file",internal=>10, maxinterval=>30, adjustafter=>5);

while (defined(my $line=$file->read)) {
    ...
}
...