gpt4 book ai didi

perl - 如何使用 Log4perl 和 Moose 报告行号?

转载 作者:行者123 更新时间:2023-12-01 15:40:48 25 4
gpt4 key购买 nike

是否有可能让 Log4perl 正确显示日志事件的行号和包/类,而不是在与 Moose 一起使用时总是在第 99 行显示 Method::Delegation?

在我的例子中,我创建了一个属性 isa Log::Log4perl::Logger 并将各种日志级别委托(delegate)给我的类(日志、警告、错误...)。这样做还会将 Delegation.pm 显示为文件。

谢谢!

最佳答案

您没有提供几乎足够的信息来诊断您的问题(例如,什么是 Method::Delegation 以及它如何连接到 Log4perl),但我敏锐的感觉告诉我您可能有一个包装器方法,您可以从中调用 Log4perl方法。您应该从这个包装器中增加 $Log::Log4perl::caller_depth 的值(并在调用 Log4perl 后减少它),以便确定正确的位置。

例如在 Moose ,我使用:

package MyApp::Role::Log;

use MooseX::Role::Strict;
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 += 4;

my $return = $this->$orig(@_);

$Log::Log4perl::caller_depth -= 4;
return $return;

} foreach @methods;


sub _build__logger
{
my $this = shift;

Log::Log4perl->easy_init() if not Log::Log4perl::initialized();
return Log::Log4perl->get_logger(ref $this)
}

no MooseX::Role::Strict;
1;

注意 CPAN 模块 MooseX::Log::Log4perl不会增加 caller_depth,这绝对应该。

关于perl - 如何使用 Log4perl 和 Moose 报告行号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2232430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com