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