2010-04-06 29 views
6

我一直在使用Log4perl廣泛的一些腳本。如果有任何WARNERROR消息已被記錄,我想增加這些腳本以設置錯誤代碼。根據現有文檔,我找不到任何明顯的方法來完成此操作。如何判斷Log4perl在運行過程中是否發出警告?

我想避免強制重寫我現有的腳本,在每個WARNERROR日誌消息上添加一個檢查;我寧願如果可能事先處理一下腳本退出這樣的僞代碼:

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 2010-04-07 02:52:23

+0

@pdxrlk不客氣!我很高興它有幫助。 – 2010-04-07 13:57:56

+0

@Sinan謝謝! – 2010-04-07 14:10:23

0

你可以使用一個wrapper和編寫自定義fatalerrorwarn方法是增加一個計數器和一個返回計數器的值的訪問。

+0

謝謝,那也可以。 – pdxrlk 2010-04-07 02:54:28

相關問題