2010-04-06 4 views
6

많은 스크립트에서 광범위하게 Log4perl을 사용했습니다. WARN 또는 ERROR 메시지가 기록 된 경우 오류 코드를 설정하는 스크립트를 보완하고 싶습니다. 기존의 문서를 기반으로이 작업을 수행 할 분명한 방법을 찾지 못했습니다.실행 중에 Log4perl에서 경고가 발생했는지 어떻게 알 수 있습니까?

내가 모든 WARN 또는 ERROR 로그 메시지에 검사를 추가하는 기존 스크립트의 무차별 재 작성하지 않도록하고 싶습니다

; 나는 가능하면이 의사처럼 스크립트를 종료하기 전에 그것을 처리하는 것을 선호 것 :

if $log->has_warnings_or_errors then 
    exit 1 
else 
    exit 0 

현재 로거가 특정 수준의 문제 메시지가 있는지 확인하기 위해 Log4Perl를 호출 할 수있는 쉬운 방법이 있나요?

답변

6

appender을 사용하십시오.

MyCounter.pm :

package MyCounter; 

use warnings; 
use strict; 

use Log::Log4perl::Level; 

sub new { 
    my($class,%arg) = @_; 
    bless {} => $class; 
} 

sub log { 
    my($self,%arg) = @_; 
    ++$self->{ $arg{log4p_level} }; 
} 

sub howmany { 
    my($self,@which) = @_; 
    my $total = 0; 
    $total += ($self->{$_} || 0) for @which; 
    $total; 
} 

1; 

MYPROG :

#! /usr/bin/perl 

use warnings; 
use strict; 

use Log::Log4perl; 

my $conf = q(
    log4perl.category.MyLogger = INFO, Screen 

    log4perl.appender.Screen = Log::Log4perl::Appender::Screen 
    log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout 
); 

Log::Log4perl->init(\$conf); 

my $l = Log::Log4perl->get_logger("MyLogger"); 

my $counter = Log::Log4perl::Appender->new("MyCounter"); 
$l->add_appender($counter); 

$l->warn("warning"); 
$l->info("info"); 
$l->error("incorrect"); 
$l->fatal("really bad, man"); 

print $counter->howmany(qw/ WARN ERROR FATAL /), "\n"; 

exit ($counter->howmany(qw/ WARN ERROR FATAL /) ? 1 : 0); 

출력 :

$ ./myprog 
WARN - warning 
INFO - info 
ERROR - incorrect 
FATAL - really bad, man 
3 
$ echo $? 
1

주석 처리 ...->warn, ...->error...->fatal 줄을

$ ./myprog 
INFO - info 
0 
$ echo $? 
0
+0

완벽; 감사! – pdxrlk

+0

@ pdxrlk 여러분을 환영합니다! 도움이 돼서 기쁩니다. –

+0

@Sinan 고마워요! –

0

당신은 wrapper을 사용하고 카운터와 그 카운터의 값을 반환하는 접근을 증가 정의 fatal, errorwarn 방법을 쓸 수 있습니다.

+0

감사합니다. – pdxrlk

관련 문제