2014-01-31 3 views
5

Я пытался выяснить, могу ли я изменить фильтр приложения во время выполнения, которое я определил через файл конфигурации.Как изменить фильтры журнала log4perl во время выполнения?

log4perl.filter.M1    = Log::Log4perl::Filter::LevelMatch 
log4perl.filter.M2    = Log::Log4perl::Filter::LevelMatch 
log4perl.filter.M1.LevelToMatch = INFO 
log4perl.filter.M1.AcceptOnMatch = true 
log4perl.filter.M2.LevelToMatch = WARN 
log4perl.filter.M2.AcceptOnMatch = true 
log4perl.filter.MyBoolean0  = Log::Log4perl::Filter::Boolean 
log4perl.filter.MyBoolean0.logic = M1 
log4perl.filter.MyBoolean1  = Log::Log4perl::Filter::Boolean 
log4perl.filter.MyBoolean1.logic = M1 || M2 

log4perl.appender.SCREEN.Filter = MyBoolean0 

Я хотел бы изменить этот фильтр из MyBoolean0 для SCREEN к MyBoolean1, но сделать это после того, как моя программа начала работать.

Poking на APPENDER_BY_NAME хэш для SCREEN с использованием Data :: Dumper показывает следующее:

$VAR1 = bless({ 
    'appender' => bless({ 
          'Filter' => 'MyBoolean0', 
          'color' => { 
... 
... 
    'filter' => bless({· 
          'params' => {· 
             'M3' => bless({· 
                 'LevelToMatch' => 'ERROR', 
                 'name' => 'M3', 
                 'AcceptOnMatch' => 1 
                 }, 'Log::Log4perl::Filter::LevelMatch'), 
             'M1' => bless({· 
                 'LevelToMatch' => 'INFO', 
                 'name' => 'M1', 
                 'AcceptOnMatch' => 1 
                 }, 'Log::Log4perl::Filter::LevelMatch'), 
             'M2' => bless({· 
                 'LevelToMatch' => 'WARN', 
                 'name' => 'M2', 
                 'AcceptOnMatch' => 1 
                 }, 'Log::Log4perl::Filter::LevelMatch') 
             }, 
          'name' => 'MyBoolean0', 
          'eval_func' => sub { "DUMMY" }, 
          'logic' => 'M1 || M2 || M3' 
         }, 'Log::Log4perl::Filter::Boolean'), 
    'warp_message' => undef, 
    'name' => 'SCREEN' 
    }, 'Log::Log4perl::Appender'); 

Но отводом с этим HASH кажется хаком мне. Есть ли лучший способ изменить фильтры appender?

+0

В зависимости от того, что большая изображение, 'Log :: Log4perl-> init_and_watch' может сделать. – ikegami

ответ

5

Вы можете использовать недокументированные Appender на недвижимость в filter:

$Log::Log4perl::Logger::APPENDER_BY_NAME{'SCREEN'}->filter(
    Log::Log4perl::Filter::by_name('MyBoolean1') 
); 

Также вы можете использовать два appenders:

log4perl.appender.SCREEN0.Filter = MyBoolean0 
log4perl.appender.SCREEN1.Filter = MyBoolean1 

И изменить его во время выполнения:

$logger->remove_appender('SCREEN0', 1); 
$logger->add_appender(
    Log::Log4perl::Config::create_appender_instance(
     $Log::Log4perl::Config::OLD_CONFIG, 
     'SCREEN1', 
     \%Log::Log4perl::Logger::APPENDER_BY_NAME 
    ) 
); 
+0

Спасибо, отлично работал. Я ударил головой по методу '-> filter (..)', не понял, что мне нужно передать объект Filter ref. к нему. Благодаря! – slm

Смежные вопросы