Oes*_*sor 8 perl logging log4perl
我想让模块在运行时管理他们的日志记录,但没有任何东西都指向单个整体配置文件.当处理在不同权限下运行的进程时,我真的不想处理每个需要能够访问系统上每个日志的进程,只需要写入它们的子集.
但是,我没有在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
Run Code Online (Sandbox Code Playgroud)
如何解析并将配置添加到当前配置中?
编辑:使用包变量的Probalem是,这只是各种类所使用的Moose角色,几乎只是MooseX :: Role ::参数化版本的Ether在使用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;
Run Code Online (Sandbox Code Playgroud)
虽然我希望避免它,但如果我自己解析配置文件,我可以通过http://search.cpan.org/perldoc?Log::Log4perl中记录的API访问perl中的配置.也就是说,
########################
# Initialization section
########################
use Log::Log4perl;
use Log::Log4perl::Layout;
use Log::Log4perl::Level;
# Define a category logger
my $log = Log::Log4perl->get_logger("Foo::Bar");
# Define a layout
my $layout = Log::Log4perl::Layout::PatternLayout->new("[%r] %F %L %m%n");
# Define a file appender
my $file_appender = Log::Log4perl::Appender->new(
"Log::Log4perl::Appender::File",
name => "filelog",
filename => "/tmp/my.log");
# Define a stdout appender
my $stdout_appender = Log::Log4perl::Appender->new(
"Log::Log4perl::Appender::Screen",
name => "screenlog",
stderr => 0);
# Have both appenders use the same layout (could be different)
$stdout_appender->layout($layout);
$file_appender->layout($layout);
$log->add_appender($stdout_appender);
$log->add_appender($file_appender);
$log->level($INFO);
Run Code Online (Sandbox Code Playgroud)
虽然另一种方法有效,但有太多的注意事项让我习惯使用它(我使用这个库,为什么我的日志记录会停止?) - 这对我的口味来说太令人惊讶了.
相反,我想我将通过查看如何使用Log :: Log4perl :: Config :: PropertyConfigurator来查看是否无法从配置文件进入Log :: Log4perl状态,该委托由 - > init委托给在需要解析配置文件时.如果我查看返回的数据结构,我可以比较logger-by-logger和appender-by-appender基础上的初始化更改,并适当地修改初始化状态,正确处理命名空间冲突等.
| 归档时间: |
|
| 查看次数: |
2654 次 |
| 最近记录: |