首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Log::Log4perl制作自记录模块

使用Log::Log4perl制作自记录模块
EN

Stack Overflow用户
提问于 2010-06-11 05:07:14
回答 2查看 1.8K关注 0票数 8

有没有办法使用Log::Log4perl创建一个智能的自记录模块,即使在没有未初始化Log4perl的调用脚本的情况下,也能将其操作记录到一个文件中?据我从文档中可以看出,使用Log4perl的唯一方法是通过配置在运行脚本中对其进行初始化,然后实现Log4perl调用的模块根据调用者的Log4perl配置记录自己。

相反,我希望模块为Log4perl提供默认的初始化配置。这将为模块的类别提供默认的文件附加器。然后,如果需要,我可以通过在调用者中用不同的配置初始化Log4perl来覆盖此行为,希望一切都能正常工作。

这种防御性日志记录行为是否可行,或者我是否需要依赖于在调用我想要记录的模块的每个.pl脚本中初始化Log4perl?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-11 05:45:49

我在Moose中的自定义日志角色中执行此操作(删除了不相关的复杂代码):

代码语言:javascript
运行
复制
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)作为默认的后备选项。

PS。您可能还想看看MooseX::Log::Log4perl,这是我在使用上面的记录器角色之前开始的地方。总有一天,当我找到它的时候,我会向MX模块提交一些非常需要的补丁,以整合我添加的一些功能。

票数 7
EN

Stack Overflow用户

发布于 2010-11-06 02:08:31

简短的答案是在某个时刻调用Log::Log4perl::initialized();,如果它为false,则设置一些默认日志记录。

棘手的部分是“某一点”。

你不能在BEGIN {}中这样做,因为即使你创建了不必要的文件,主脚本的也会践踏你的初始化。您不希望在每次调用get_logger()之前执行此操作,因为这很浪费。所以你应该在模块初始化的时候这样做,比如sub new或者sub init。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3018528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档