我一直试图弄清楚我是否可以在运行时更改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更改为SCREEN更改为MyBoolean1,但是在程序开始运行后执行此操作.
使用Data :: Dumper查看SCREEN的APPENDER_BY_NAME哈希显示以下内容:
$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','M2' => bless( {· 'LevelToMatch' => 'WARN','name' => 'M2','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的过滤器?
解决方法
您可以使用未记录的appender属性过滤器:
$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 ) );