-1

这个大日志文件几乎每秒都在变化,如下所示:

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 分钟有一个 regex mach,它会发送一个邮件通知;然后在脚本再次运行的第 t+1 分钟,即使没有“新匹配”,它也会发送另一封邮件通知。

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

4

1 回答 1

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
}
于 2013-07-10T10:49:47.977 回答