2013-07-10 2 views
-1

Существует этот большой файл журнала меняется почти каждый второй линиями, как следующее:Perl: Как заставить Perl запомнить последнюю строку, которую она читала?

013-07-10 17:59:08 +0900 "app.log_count":0," 
013-07-10 17:59:09 +0900 "app.log_count":4," 
013-07-10 17:59:10 +0900 "app.log_count":1," 
013-07-10 17:59:12 +0900 "app.log_count":5," 

Я делаю скрипт, который читает этот журнал. В частности, он пытается проверить, если «app.log_count» часть выходит за пределы определенного порога:

open my $infile, "<", $file_location or die("$!: $file_location"); 
    while (<$infile>) { 
     if ("app.log_count":(\d+)) { 
      if ($_ >= $threshold) { 
      # warning 
      } else { 
      # not warning; 
      } 
     } 
    }  
close $infile; 

Что я планирую запустить каждую минуту, как хрон.

Но я хочу создать сценарий, который не запускает весь файл каждый раз. Если скрипт читает каждый файл журнала каждую минуту, и мы предполагаем, что в минуту t появится регулярное выражение, оно отправит уведомление по почте; то в минуту t + 1, когда скрипт снова запустится, он отправит другое почтовое уведомление, даже если не было «нового совпадения».

Так что мне нужно создать сценарий , который запоминает последнюю позицию (строку), которую он читает,, поэтому в следующий раз он начинает считывать с этой позиции. Есть идеи? Всего хорошего, Адриан.

+2

Используйте РАССКАЖИ() и искать() –

+1

возможный дубликат [Perl: Regex для чтения журнала о] (http://stackoverflow.com/questions/17566296/perl-regex-for-reading-a-log-statement) –

+1

Возможно, ['File :: Tail'] (http://search.cpan.org/perldoc?File%3A%3ATail) - это то, что ты ищешь. – TLP

ответ

0

Вот решение, которое я написал с помощью:

#!/usr/bin/env perl 
use strict; 
use warnings; 
use utf8; 

use File::Tail; 
_check_log(); 

sub _check_log { 
    my $log_dir  = ""; 
    my $log_name  = ""; 
    my $file_location = $log_dir . $log_name; 
    my $threshold  = 10; 

    my $infile = File::Tail->new(
    name  => $file_location, 
    maxinterval => 300, 
); 

    while (defined(my $line = $infile->read)) { 
    if ($line =~ m{"app.log_count":(\d+)} && $1) { 
     if ($1 >= $threshold) { 
     _log_warn($1); 
     } 
    } 
    } 
} 

sub _log_warn { 

    # Stuff you wanna have done when there are too many errors 
} 
+0

@Paulchenkiller Спасибо за изменения и подсказку regex ^^ – ado

+0

приветствую :) –

+0

см. Также http://www.perlmonks.org/bare/?node_id=305989 –

Смежные вопросы