有没有办法使用日志::Log4perl制作一个智能自记录模块,即使在没有调用脚本且未初始化 Log4perl 的情况下,也可以将其操作记录到文件中?据我从文档中可以看出,使用 Log4perl 的唯一方法是在运行脚本中从配置初始化它,然后实现 Log4perl 调用的模块根据调用者的 Log4perl 配置记录自己。
相反,我希望模块为 Log4perl 提供默认的初始化配置。这将为模块的类别提供默认的文件附加器。然后,如果需要,我可以通过使用不同的配置在调用者中初始化 Log4perl 来覆盖此行为,并且一切都会正常工作。
这种防御性日志记录行为是否可能,或者我是否需要在每个调用我想要记录的模块的 .pl 脚本中依赖初始化 Log4perl?
我在自定义日志角色中执行此操作Moose(删除无关的复杂代码):
package MyApp::Role::Log;
use Moose::Role;
use Log::Log4perl;
my @methods = qw(
log trace debug info warn error fatal
is_trace is_debug is_info is_warn is_error is_fatal
logexit logwarn error_warn logdie error_die
logcarp logcluck logcroak logconfess
);
has _logger => (
is => 'ro',
isa => 'Log::Log4perl::Logger',
lazy_build => 1,
handles => \@methods,
);
around $_ => sub {
my $orig = shift;
my $this = shift;
# one level for this method itself
# two levels for Class:;MOP::Method::Wrapped (the "around" wrapper)
# one level for Moose::Meta::Method::Delegation (the "handles" wrapper)
local $Log::Log4perl::caller_depth;
$Log::Log4perl::caller_depth += 4;
my $return = $this->$orig(@_);
$Log::Log4perl::caller_depth -= 4;
return $return;
} foreach @methods;
method _build__logger => sub {
my $this = shift;
my $loggerName = ref($this);
Log::Log4perl->easy_init() if not Log::Log4perl::initialized();
return Log::Log4perl->get_logger($loggerName)
};
正如你所看到的,日志对象是自初始化的——如果Log::Log4perl->init
还没有被调用,那么easy_init
叫做。您可以轻松地修改它以允许每个模块自定义其记录器——我使用可选的角色参数来做到这一点,ref($this)
作为默认后备。
附言。您可能还想看看MooseX::Log::Log4perl,这是我在使用上面的记录器角色之前开始的地方。有一天,当我有时间时,我会向该 MX 模块提交一些急需的补丁,以合并我添加的一些功能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)