Log::Log4Perl отличается назначением ведения журнала в зависимости от LogLevel

Моя цель состоит в том, чтобы регистрировать «отладочные» сообщения (и последующие уровни: информация, предупреждение, фатальный...) в файл, но только «предупреждения»/фатальные/ошибки на экране. Оба одновременно.

Я попробовал с easy_init ("stealth logging"):

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 ..., то все предупреждающие и отладочные сообщения будут выводиться на экран и в файл.

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


person eli    schedule 28.02.2019    source источник


Ответы (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

Версии

Я тестировал с:

  • ОС: Ubuntu 14.04.5 LTS
  • перл: v5.18.2
  • Log::Log4perl: 1,49 (и 1,41)
person vkats    schedule 28.02.2019
comment
это здорово, спасибо. Я пробовал с подробным методом раньше, но на самом деле он не работал. Но тем не менее я все еще жду, если есть/у кого-то есть easy_init решение (меньше печатать/меньше запоминать/лучше читабельность (‹- это может быть субъективно)). - person eli; 05.03.2019
comment
Спасибо, @eli, я добавил версии, на которых запускал MWE, чтобы избежать путаницы (в первую очередь я должен был это сделать). С какими проблемами вы столкнулись? - person vkats; 05.03.2019
comment
извините за путаницу. Когда я пробовал это в прошлом, это не сработало, но ваш ответ работает правильно, и я проголосовал за него. - person eli; 05.03.2019