Log::Log4Perl различное назначение регистрации в зависимости от LogLevel

Моя цель - записать сообщения "debug" (и последующие уровни: info,warning, fatal,...) в файл, но только "warnings"/fatal/error на экран. Оба одновременно.

Я попытался с easy_init ( "стелс- логинг "):

Log::Log4perl->easy_init(
    { level => $DEBUG, file => ":utf8> ./log_" . basename($0) . "_.log" },
    { level => $WARN, file => 'STDOUT' },
);

... Но level второго определения перезаписывает общий лог-уровень.

if (false){
    WARN "some bad thing";  # print this to the screen AND to the file
}else{
    do_something;
    DEBUG "doing something";    # print this just to the file
    if (bla){WARN "another bad thing"}
}

В этом случае предупреждение выводится на экран и в файл правильно, НО сообщение "DEBUG" не будет напечатано (perl 5.26)

Ввод { level => $DEBUG ... линия после {level => $WARN ... -линии, тогда все предупреждающие и отладочные сообщения выводятся на экран и в файл.

Может кто-нибудь подсказать, пожалуйста, как это сделать (если вообще возможно)? Нужно ли уточнить?

1 ответ

Следующий минимальный рабочий пример Perl:

  • печатает в файл DEBUG и более высокие уровни
  • печать на экран ПРЕДУПРЕЖДЕНИЕ и более высокие уровни

Я не пользовалась easy_init как подробная конфигурация более подробно. У меня есть комментарии в сценарии, которые описывают, что делает конфигурация. Дайте мне знать, если это нужно более подробно.

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

# rootlogger prints to "Logfile" and "Screen"
# "Logfile" and "Screen" are then defined with the proper appender (File and Screen)
# and the proper Threshold is used to limit what goes in each appender

my $conf = q(
log4perl.rootLogger=DEBUG,Logfile,Screen

log4perl.appender.Logfile           = Log::Log4perl::Appender::File
log4perl.appender.Logfile.filename  = /home/USER/test.log
log4perl.appender.Logfile.mode      = append
log4perl.appender.Logfile.utf8      = 1
log4perl.appender.Logfile.Threshold = DEBUG
log4perl.appender.Logfile.recreate  = 1
log4perl.appender.Logfile.layout    = Log::Log4perl::Layout::SimpleLayout

log4perl.appender.Screen            = Log::Log4perl::Appender::Screen
log4perl.appender.Screen.stderr     = 0
log4perl.appender.Screen.Threshold  = WARN
log4perl.appender.Screen.layout     = Log::Log4perl::Layout::SimpleLayout
);
Log::Log4perl::init( \$conf );

my $logger = Log::Log4perl->get_logger( 'foo' );

WARN "some bad thing";      # print this to the screen AND to the file
DEBUG "doing something";    # print this just to the file
~ $ perl log4perl.pl
WARN - some bad thing

~ $ cat test.log 
WARN - some bad thing
DEBUG - doing something
Другие вопросы по тегам