이 서브 루틴을 사용하여 파일에 로그인하는 펄 (revision 5.0 version 8 subversion 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