我在perl中有一个tcp服务器(修订版5.0版本8颠覆0),它使用此子例程登录文件。
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 :(得分:3)
OUT
是一个全局包。假设升级到真正的日志系统(如Log4perl)是不可能的,您可以使用名为$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;
}