2015-05-28 85 views
2

我正在使用rsyslog的基於屬性的過濾器發送特定的日誌到單獨的文件,這些日誌將使用perl進行解析。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>){

我不能看到什麼錯在我的代碼。請提出什麼是錯誤。

回答

4

你有兩個不同的$fh詞彙(我的)變量,

因此,而不是宣佈使用新的

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

保持先前聲明的一個,

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

我在不同的$跳頻打開文件變量,我繼續從以前關閉的閱讀,從而造成所有麻煩。這是你的建議嗎? – shivams

+2

@shivams是的,請檢查['由其他聲明隱藏的變量](http://perlmaven.com/scope-of-variables-in-perl) –

+1

謝謝我真的被這個問題搞砸了,從來沒有意識到這是我的問題。再次感謝。 – shivams