2012-10-08 3 views
2

log4Perl에서 프로그램이 eval 절 외부에서 치명적인 오류를 발생시킬 수있는 방법이 있습니까? 처리되지 않은 프로그램 종료의 경우에도 log4perl을 호출하기를 원합니다. 선호하는 모든 Perl 프로그램과 함께로드 된 표준 모듈 내에 관련 오류 처리기를 추가하고 싶습니다.
펄 버전은 현재 5.8이지만 곧 업그레이드 될 예정입니다.
주어진 답변에 대한 테스트 코드입니다. 화면에 DIE도 표시되지 않으며 die.txt가 만들어지지 않습니다.Perl : 처리되지 않은 오류의 경우 log4Perl 호출 log4perl

use Log::Log4perl qw(get_logger); 
$a->test(); 
$SIG{__DIE__} = sub { 
warn "DIE"; 
open DIE,">die.txt"; 
print DIE "died\n"; 
close DIE; 
}; 
+0

사용에 대한 perlipc을 참조하십시오 자주 묻는 질문처럼 보인다. // 삭제 된 질문에 댓글에 응답합니다. – ZyX

+1

문제가 발생하면 '$ SIG {__ DIE __}'가 아직 설정되지 않았습니다. '$ SIG {__ DIE __}'를 먼저 설정하면됩니다. – dan1111

답변

4

How can I make sure my application logs a message when it dies unexpectedly?

use Log::Log4perl qw(get_logger); 

$SIG{__DIE__} = sub { 
    if($^S) { 
     # We're in an eval {} and don't want log 
     # this message but catch it later 
     return; 
    } 
    local $Log::Log4perl::caller_depth = 
      $Log::Log4perl::caller_depth + 1; 
    my $logger = get_logger(""); 
    $logger->fatal(@_); 
    die @_; # Now terminate really 
}; 

가가 "마스크"는 의견 (어떤 포맷이 허용되지 않습니다 코드로 차례)에 밑줄 역 따옴표를 둘러싼 더

+0

처리되지 않은 예외가있는 경우에는 die가 호출 될 때 유용합니다. undef 값에 대한 메소드 호출. – weismat

+0

어떻게 생각 하시나요? 여기에'perl -e "$ SIG {__ DIE__} = sub {warn join q//, 666, @_}; $ foo-> what;"을 실행하는 데모가 있습니다. " –

+0

작은 프로그램을 작성하고 print 경고하고 오류 파일을 작성/작성하려고 시도했습니다. – weismat