如何在运行时更改log4perl appender的过滤器?

时间:2014-01-31 18:27:04

标签: perl log4perl

我一直在试图弄清楚我是否可以在运行时更改appender的过滤器,这是我通过配置文件定义的。

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的{​​{1}}更改为SCREEN,但我的程序开始运行后会执行此操作。

使用Data :: Dumper查找MyBoolean1 APPENDER_BY_NAME哈希显示以下内容:

SCREEN

但是这个HASH的混乱对我来说似乎很骇人听闻。有没有更好的方法来更改appender的过滤器?

1 个答案:

答案 0 :(得分:5)

您可以使用未记录的appender属性filter

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

你也可以使用两个appender:

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
    )
);