Perl:如何让Perl记住它读取的最后一行?

时间:2013-07-10 09:05:47

标签: 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;

我计划每分钟作为一个cron工作。

但是我想创建一个每次都不运行整个文件的脚本。如果脚本每分钟读取所有日志文件,并且我们假设在分钟t有正则表达式,它将发送邮件通知;然后在脚本再次运行的第t + 1分钟,即使没有“新匹配”,它也会发送另一个邮件通知。

所以我需要创建一个脚本来记住它读取的最后一个位置(行),所以下次它开始从该位置读取。有任何想法吗?一切顺利,阿德里安。

1 个答案:

答案 0 :(得分:1)

以下是我在您的帮助下撰写的解决方案:

#!/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
}