Perl无法尾部旋转日志文件

时间:2015-05-28 06:28:23

标签: perl logging

我正在使用基于属性的rsyslog过滤器将特定日志发送到单独的文件,其中将使用perl解析这些日志。

这是我的rsyslog条目

$template SPLIT,"/home/shivam/hello-%$YEAR%%$MONTH%%$DAY%%$HOUR%%$MINUTE%"
:msg, contains, "hello" -?SPLIT

因此,rsyslog将为每分钟后生成的日志创建单独的文件。文件将像hello-201505281139一样创建。

我的解析这些文件的perl脚本是

use strict;
use warnings;
use POSIX qw(strftime);

my $date = strftime "%Y%m%d%H%M", localtime;
my $file = '/root/defer-'.$date;
open(my $fh,'<',$file) or die "unable to open file $!\n";

while(1) {
    while(my $line = <$fh>){
                    print "$date\n";
                    print "$line";
            }
    sleep(2);
    unless ($date == strftime "%Y%m%d%H%M", localtime) {
            close($fh);
            $date = strftime "%Y%m%d%H%M", localtime;
            $file = '/root/defer-'. $date;
            system("touch $file");      
            open(my $fh,'<',$file) or die "unable to open file $!\n";

    }
}

除非阻止我检查如果分钟已经改变,那么我关闭以前的文件并打开新文件。 我从脚本创建新文件而不是等待rsyslog创建文件的原因是日志的频率不是那么多。所以我创建文件,然后开始阅读它,希望当任何新日志到来时,我将能够阅读它。

但发生的事情是我能够创建新文件但无法从该文件中读取任何内容。

这是我得到的警告

readline() on closed filehandle $fh at test.pl line 14.

我的代码中的第14行就是这一行 while(my $line = <$fh>){

我无法在代码中看到任何错误。请说明错误是什么。

1 个答案:

答案 0 :(得分:4)

您有两个不同的$fh词汇(我的)变量,

所以改为宣布新的

open(my $fh,'<',$file) or die "unable to open file $!\n";

继续使用先前声明的

open($fh,'<',$file) or die "unable to open file $!\n";