Определение нескольких уровней ведения журнала в Log4Perl

У меня есть следующий файл конфигурации log4perl.conf, который я использую для нескольких сценариев. Он настроен на отображение сообщений со всех уровней журнала.

# Log4perl configuration file

log4perl.rootLogger = ALL, screen, file

log4perl.appender.screen = Log::Log4perl::Appender::Screen
log4perl.appender.screen.stderr = 0
log4perl.appender.screen.layout = PatternLayout
log4perl.appender.screen.layout.ConversionPattern = %d %p> %m%n

log4perl.appender.file = Log::Log4perl::Appender::File
log4perl.appender.file.filename = sub { my $script=$0; $script =~ s/(dev|test|prod)\/script/log/; $script =~ s/\.[^.]+$//; return "$script.log" }
log4perl.appender.file.mode = append
log4perl.appender.file.layout = PatternLayout
log4perl.appender.file.layout.ConversionPattern = %d %p> %m%n

Сценарии используют этот фрагмент кода для его инициализации:

use Log::Log4perl;
# Logger configuration
Log::Log4perl->init('/etc/log4perl.conf');
$logger = Log::Log4perl->get_logger();

Каков наилучший способ настроить уровень ведения журнала без необходимости каждый раз изменять файл конфигурации, поскольку существует несколько сценариев, использующих одну и ту же конфигурацию.

Могу ли я создать новый регистратор и использовать его вместо корневого регистратора?


person A_B    schedule 25.01.2017    source источник
comment
Вы говорите, что хотите временно изменить уровень ведения журнала (например, в небольшом разделе одного скрипта) без внесения изменений в конфигурацию? Или вы хотите отдельный регистратор для каждого скрипта?   -  person ThisSuitIsBlackNot    schedule 25.01.2017
comment
Я хотел бы иметь возможность временно изменить уровень ведения журнала для одного скрипта, не затрагивая другие скрипты. Не уверен, что это лучший способ добиться этого.   -  person A_B    schedule 25.01.2017


Ответы (1)


Вы можете использовать level способ настроить уровень ведения журнала внутри вашей программы:

use strict;
use warnings 'all';

use Log::Log4perl;
use Log::Log4perl::Level;

Log::Log4perl->init(\*DATA);

my $logger = Log::Log4perl->get_logger;

$logger->info('before');
$logger->level($INFO);
$logger->info('after');

__DATA__
log4perl.rootLogger             = WARN, Screen
log4perl.appender.Screen        = Log::Log4perl::Appender::Screen
log4perl.appender.Screen.layout = Log::Log4perl::Layout::PatternLayout
log4perl.appender.Screen.layout.ConversionPattern = %d %p> %m%n

Вывод:

2017/01/25 12:59:58 INFO> after

Это не повлияет на другие сценарии, использующие тот же файл конфигурации, поскольку каждый из них будет иметь собственный экземпляр Log::Log4perl.

В качестве альтернативы вы можете использовать методы more_logging/inc_level или less_logging/dec_level, которые принимают дельта-значение вместо абсолютного уровня ведения журнала.

person ThisSuitIsBlackNot    schedule 25.01.2017