这个大日志文件几乎每秒都会改变,如下所示:
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分钟,即使没有“新匹配”,它也会发送另一个邮件通知。
所以我需要创建一个脚本来记住它读取的最后一个位置(行),所以下次它开始从该位置读取。有任何想法吗?一切顺利,阿德里安。
答案 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
}