log4perl:如何将 ERROR 消息写入文件并将 DEBUG 消息写入 stderr?

log4perl: How to write ERROR message to file and DEBUG message to stderr?

我想把ERROR信息写到一个文件,把DEBUG信息写到stderr,然后我写了下面的代码:

#!/usr/bin/perl

use strict;
use warnings;
use Log::Log4perl qw(:easy);

Log::Log4perl->easy_init(
        {
            file  => ">> error_log",
            level => $ERROR,
        },
        {
            file  => "STDERR",
            level => $DEBUG,
        }
        );

ERROR( "ERROR MESSAGE" );
DEBUG( "DEBUG MESSAGE" );

当我运行上面的代码时,消息ERROR MESSAGEDEBUG MESSAGE写入文件和stderr,谁能解释为什么?

实现不同层级、同一分类同时输出到文件和屏幕,可以使用a custom filter。例如:

use feature qw(say);
use strict;
use warnings;
use Log::Log4perl qw(:easy);

my $conf   = <<'EOF';
log4perl.rootLogger             = DEBUG, file, screen
log4perl.filter.MatchDebug = Log::Log4perl::Filter::LevelMatch
log4perl.filter.MatchDebug.LevelToMatch  = DEBUG
log4perl.filter.MatchDebug.AcceptOnMatch = true

log4perl.filter.MatchError = Log::Log4perl::Filter::LevelMatch
log4perl.filter.MatchError.LevelToMatch  = ERROR
log4perl.filter.MatchError.AcceptOnMatch = true

log4perl.appender.file          = Log::Log4perl::Appender::File
log4perl.appender.file.filename = error_log.txt
log4perl.appender.file.mode     = append
log4perl.appender.file.utf8     = 1
log4perl.appender.file.Filter   = MatchError
log4perl.appender.file.layout   = SimpleLayout

log4perl.appender.screen         = Log::Log4perl::Appender::Screen
log4perl.appender.screen.stderr  = 1
log4perl.appender.screen.utf8    = 1
log4perl.appender.screen.Filter   = MatchDebug
log4perl.appender.screen.layout   = SimpleLayout
EOF

Log::Log4perl::init( $conf );
ERROR( "ERROR MESSAGE" );
DEBUG( "DEBUG MESSAGE" );

另见