2012-05-06 14 views
3

私は、このサブルーチンを使ってファイルにログインするperl(リビジョン5.0バージョン8のサブバージョン0)にtcpサーバを持っています。私のPerlスクリプトで、 "ファイルの記述子が閉じられているファイルハンドルを閉じた状態で" print()が表示されるのはなぜですか?

sub logger { 
     return if ($LOGFILE eq "") ; 
     my ($idt, $str) = @_ ; 
     unless(defined($str)) { 
       $str = $idt ; 
       $idt = '' ; 
     } 
     my ($s,$m,$h,$J,$M,$A) = localtime(time()) ; 
     if(!open(OUT,">>$LOGFILE")) 
     { 
       warn "logger:error open [$LOGFILE]:[$!]\n"; 
       return; 
     } 
     if (!printf OUT "%4.4d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d %s %s -> %s\n", 
         $A+1900, $M+1, $J, $h, $m, $s, $idt, $HOSTNAME, $str) 
     { 
       warn "logger:error print [$LOGFILE]:[$!]\n"; 
       return; 
     } 
     if (!close(OUT)) 
     { 
       warn "logger:error close [$LOGFILE]:[$!]\n"; 
       return; 
     } 
} 

したがって、このログファイルには同時に書き込みが行われます。 例外、私はSTDERRでこのエラーがあります:オープンでエラーなし

printf() on closed filehandle 

logger :error print [/my/path/logFile.LOG]:[Bad File Descriptor]

を!

この問題を解決するにはどうすればよいですか?

+0

5.8 5.8.0の後に* 9 * maintainenceのリリースがありました:そのようLog4perlなど、実際のロギングシステムへのアップグレードと仮定すると問題外である、あなたは$OUTと呼ばれる字句ファイルハンドルを使用することができます。あなたは5.8.9にアップグレードしようとしましたか? (5.8.0用にコンパイルされたモジュールは5.8.9で使用できます) – ikegami

+0

Perl 5.8.0は10年以上前にリリースされました*。 5.8.9でも3歳以上です。 – ephemient

+0

私は知っています...しかし、私は今それをアップグレードすることはできません。 – user1334149

答えて

3

OUTは、グローバルパッケージです。

sub logger { 
    $LOGFILE or return; 
    my ($idt, $str) = @_ ; 

    unless(defined($str)) { 
     $str = $idt ; 
     $idt = '' ; 
    } 

    my ($s,$m,$h,$J,$M,$A) = localtime(time()) ; 

    my $OUT; 

    unless (open $OUT, '>>', $LOGFILE) { 
     warn "logger:error open [$LOGFILE]:[$!]\n"; 
     return; 
    } 

    unless (printf $OUT 
     "%4.4d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d %s %s -> %s\n", 
     $A+1900, $M+1, $J, $h, $m, $s, $idt, $HOSTNAME, $str 
    ) { 
     warn "logger:error print [$LOGFILE]:[$!]\n"; 
     return; 
    } 

    unless (close $OUT) { 
     warn "logger:error close [$LOGFILE]:[$!]\n"; 
     return; 
    } 

    return 1; 
} 
+0

あなたのおかげで問題は解決しました。 – user1334149

+2

2-arg open、悪い。 3-argオープン、良い! – ephemient

関連する問題