私は、このサブルーチンを使ってファイルにログインする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]
を!
この問題を解決するにはどうすればよいですか?
5.8 5.8.0の後に* 9 * maintainenceのリリースがありました:そのようLog4perlなど、実際のロギングシステムへのアップグレードと仮定すると問題外である、あなたは
$OUT
と呼ばれる字句ファイルハンドルを使用することができます。あなたは5.8.9にアップグレードしようとしましたか? (5.8.0用にコンパイルされたモジュールは5.8.9で使用できます) – ikegamiPerl 5.8.0は10年以上前にリリースされました*。 5.8.9でも3歳以上です。 – ephemient
私は知っています...しかし、私は今それをアップグレードすることはできません。 – user1334149