我正在使用log4perl,我想在单独的文件中记录所有FATAL事件。
这是我的剧本:
#!/usr/bin/perl
use strict;
use warnings FATAL => 'all';
use Log::Log4perl qw(get_logger);
Log::Log4perl::init('log4perl.conf');
my $l_aa = get_logger('AA');
$l_aa->fatal('fatal');
my $l_bb = get_logger('BB');
$l_bb->info('info');
这是我的配置文件:
## What to log
log4perl.logger = FATAL, FatalLog
log4perl.logger.BB = INFO, MainLog
## Logger MainLog
log4perl.appender.MainLog = Log::Log4perl::Appender::File
log4perl.appender.MainLog.filename = log4perl_main.log
log4perl.appender.MainLog.layout = PatternLayout
log4perl.appender.MainLog.layout.ConversionPattern = \
[%d{yyyy-MM-dd HH:mm:ss}] %p - %c - %m%n
## Logger FatalLog
log4perl.appender.FatalLog = Log::Log4perl::Appender::File
log4perl.appender.FatalLog.filename = log4perl_fatal.log
log4perl.appender.FatalLog.layout = PatternLayout
log4perl.appender.FatalLog.layout.ConversionPattern = \
[%d{yyyy-MM-dd HH:mm:ss}] %p - %c - %m%n
我希望通过此设置,文件log4perl_fatal.log
将只获得FATAL级事件。但这是我在运行脚本后得到的结果:
$ tail -f *log
==> log4perl_fatal.log <==
[2014-04-13 08:41:22] FATAL - AA - fatal
[2014-04-13 08:41:22] INFO - BB - info
==> log4perl_main.log <==
[2014-04-13 08:41:22] INFO - BB - info
为什么我要在log4perl_fatal.log
中获得INFO级别的活动?
如何在单独的文件中仅记录FATAL级事件?
PS这是一个带有此脚本的GitHub repo&amp;配置。
答案 0 :(得分:2)
您的conf文件包含以下行:
log4perl.logger = FATAL, FatalLog
您需要的是以下内容:
log4perl.logger.AA = FATAL, FatalLog
否则,FatalLog将成为两个记录器的全能型,而不是与此实例隔离:
my $l_aa = get_logger('AA');
答案 1 :(得分:0)
这是log4perl常见问题解答中涵盖的问题 - https://metacpan.org/pod/Log::Log4perl::FAQ#How-can-I-collect-all-FATAL-messages-in-an-extra-log-file
在示例中log4perl_fatal.log
因为appender可加性而获得INFO级事件。
要解决此问题,应将此行添加到配置文件中:
log4perl.appender.FatalLog.Threshold = FATAL
然后输出文件得到预期的输出:
$ tail log4perl*log
==> log4perl_fatal.log <==
[2014-05-04 20:00:39] FATAL - AA - fatal
==> log4perl_main.log <==
[2014-05-04 20:00:39] INFO - BB - info