Log4perl:如何在运行时动态加载appender?

前端之家收集整理的这篇文章主要介绍了Log4perl:如何在运行时动态加载appender?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想让模块在运行时管理他们的日志记录,但没有任何东西都指向单个整体配置文件.当处理在不同权限下运行的进程时,我真的不想处理每个需要能够访问系统上每个日志的进程,只需要写入它们的子集.

但是,我没有在Log4perl手册中找到有关如何在运行时从配置文件初始化其他appender的文档. http://metacpan.org/pod/Log::Log4perl::Appender引用了一个add_appender方法,但它适用于实例化的appender对象而不是conf文件.它也没有定义记录器对象和logger-> appender关系.

我尝试从每个软件包初始化每个软件包,但这只是在每次初始化时都会破坏现有的配置.我想做的是:

my $foo = Foo->new() ## Checks Log::Log4perl::initialized(),sees that it
                     ## hasn't been initalized yet,inits Log4perl from foo.conf
my $bar = Bar->new() ## Checks Log::Log4perl::initialized(),sees that it
                     ## has been initalized. Adds appenders and loggers defined
                     ## in bar.conf into the initialized configuration

如何解析并将配置添加到当前配置中?

编辑:使用包变量的Probalem是这只是一个Moose角色被各种类消耗,几乎只是MouxX :: Role ::参数化版本的以太在Making self-logging modules with Log::Log4perl的答案.因此,我的记录器正在编写到库中消耗它,我没有一个全局变量,我每次使用它都可以工作.

虽然..

如果我在MooseX :: Role :: Parameterized角色块之外声明一个全局变量,那么每个使用该角色的类都会使用相同的conf变量吗?

解决方法

您可以记住已加载的配置文件(下面的代码中有%log_configs哈希值).当新类到达时,您可以重新读取所有配置,将它们合并在一起并使用字符串引用参数再次初始化Log :: Log4perl到init.

我通常希望每个应用程序都有一个日志配置,因为它更容易维护和重新加载.

package Logger;
use Moose::Role;
use Log::Log4perl;

our %log_configs = ();

around BUILDARGS => sub {
    my $orig  = shift;
    my $class = shift;

    my $config_name = lc($class) . '.conf';

    # if the config is not integrated yet
    if(! defined $log_configs{$config_name}) {
        $log_configs{$config_name} = 1;

        # reload all configs including new one
        my $config_text = '';
        for my $file (sort keys %log_configs) {
            $config_text .= "\n" . do {
                local $/;   # slurp
                unless(open my $fh,"<",$file) {
                    warn "$file could not be open\n";
                    '';
                }
                else {
                    <$fh>
                }
            };
        }

        # refresh config
        Log::Log4perl::init(\$config_text);
    }

    return $class->$orig(@_);
};


package Foo;
use Moose;
with 'Logger';
use Log::Log4perl ':easy';

sub BUILD {
    ERROR 'Foo reporting';
}


package Bar;
use Moose;
with 'Logger';
use Log::Log4perl ':easy';

sub BUILD {
    INFO 'Bar reporting';
}


package main;

my $foo = Foo->new;
my $bar = Bar->new;

猜你在找的Perl相关文章