2017-01-11 3 views
4

내 Perl 스크립트에 대한 로그를 생성하고 싶습니다. 하지만 내가 Log::Log4perl을 사용할 때 어쨌든 스크립트가 던져 줄 오류를 어떻게 잡을 수 있습니까? 로그 파일에 로그하는 방법. 현재 ERROR(), DEBUG() 등 variouys 태그에 명시 적으로 쓰는 것이 로그 파일에 인쇄되는 유일한 방법입니다.Log :: Log4perl을 사용하여 예기치 않은 오류를 모두 기록하십시오.

Log :: Log4perl을 사용하여이를 수행 할 수있는 방법이 있습니까? 아래의 코드, 예를 들어

:

use strict; 
use warnings; 
use Log::Log4perl qw(:easy); 

Log::Log4perl->easy_init({ level => $DEBUG, 
          file => ">>test.log" }); 

my $logger = Log::Log4perl->get_logger();       

$logger->fatal("This is", " fatal"); 
$logger->error("This is error"); 
$logger->warn( "This is warn"); 
$logger->info( "This is info"); 
$logger->debug("This is debug"); 
$logger->trace("This is trace"); 

my $a = 10; 

my $b = $a/0; 

제로 오차로 인한 격차가 스크립트에 기록되지 않는다. 광산 원본 스크립트는 너무 복잡하여 각 오류를 검사하지 않으므로 stderr의 오류를 로그 파일에 기록하는 무언가가 필요합니다. 우리는 상기 서브 블록의 경우를 입력 할 때

답변

3
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; 
    } 
    $Log::Log4perl::caller_depth++; 
    my $logger = get_logger(""); 
    $logger->fatal(@_); 
    die @_; # Now terminate really 
}; 

또한 Log4perl - how can I make sure my application logs a message when it dies unexpectedly?

+0

참조. 응용 프로그램이 죽을 때 발생하는 오류가 발생할 때마다 해당 스크립트를 기록하고 스크립트 실행을 중단하기를 원할 때만 필자는이를 원합니다. – Mohit

+0

@Mohit :'$^S'는'eval'을 실행할 때 true를 반환합니다. –