6

私は多くのスクリプトでLog4perlを広範囲に使用してきました。WARNこれらのスクリプトを拡張して、またはERRORメッセージがログに記録された場合にエラー コードを設定したいと考えています。既存のドキュメントに基づいてこれを行う明白な方法を見つけることができませんでした。

WARNすべてのメッセージまたはERRORログメッセージにチェックを追加するために、既存のスクリプトを力ずくで書き直すことは避けたいと思います。可能であれば、次の疑似コードのように、スクリプトを終了する前に処理したいと思います。

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

Log4Perl を呼び出して、現在のロガーに特定のレベルの問題メッセージがあるかどうかを判断する簡単な方法はありますか?

4

2 に答える 2

6

アペンダーを使用します。

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
警告-警告
INFO-情報
エラー-正しくありません
致命的-本当に悪い、男
3
$エコー$?
1

、、、および行をコメントアウトして取得し...->warnます...->error...->fatal

$ ./myprog
INFO-情報
0
$エコー$?
0
于 2010-04-06T17:22:31.530 に答える
0

ラッパーを使用してカスタムを記述fatalし、カウンターerrorwarnそのカウンターの値を返すアクセサーをインクリメントするメソッドを作成できます。

于 2010-04-06T14:48:26.167 に答える