如何判断Log4perl在运行期间是否发出任何警告?

如何判断Log4perl在运行期间是否发出任何警告?,perl,log4perl,Perl,Log4perl,我已经在许多脚本中广泛使用。如果记录了任何WARN或error消息,我想增加这些脚本以设置错误代码。基于现有文档,我找不到任何明显的方法来实现这一点 我希望避免对现有脚本进行暴力重写,以在每个WARN或ERROR日志消息上添加检查;如果可能的话,我更愿意在脚本退出之前处理它,如以下伪代码: if $log->has_warnings_or_errors then exit 1 else exit 0 有没有简单的方法可以调用Log4Perl来确定当前记录器是否发出了某些级别的消息

我已经在许多脚本中广泛使用。如果记录了任何
WARN
error
消息,我想增加这些脚本以设置错误代码。基于现有文档,我找不到任何明显的方法来实现这一点

我希望避免对现有脚本进行暴力重写,以在每个
WARN
ERROR
日志消息上添加检查;如果可能的话,我更愿意在脚本退出之前处理它,如以下伪代码:

if $log->has_warnings_or_errors then
  exit 1
else
  exit 0
有没有简单的方法可以调用Log4Perl来确定当前记录器是否发出了某些级别的消息?

您可以使用一个自定义的
fatal
error
warn
方法来递增计数器和返回该计数器值的访问器。

使用一个

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;
#! /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:

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;
#! /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