Warm tip: This article is reproduced from serverfault.com, please click

perl-log4perl:如何将ERROR消息写入文件,将DEBUG消息写入stderr?

(perl - log4perl: How to write ERROR message to file and DEBUG message to stderr?)

发布于 2020-11-29 08:11:34

我想将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,有人可以解释原因吗?

Questioner
Ren
Viewed
11
Håkon Hægland 2020-11-29 21:23:37

要实现不同级别和相同类别的文件和屏幕输出,可以使用自定义过滤器例如:

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" );

另请参见如何在Log :: Log4perl中设置两个具有不同日志级别的附加程序?