當與Moose一起使用時,是否可以讓Log4perl正確顯示日誌事件的行號和包/類,而不是總是在第99行的方法::授權?如何使用Log4perl和Moose報告行號?
在我的情況下,我創建了一個屬性isa Log :: Log4perl :: Logger,並將各種日誌級別委託給我的類(日誌,警告,錯誤...)。這樣做也將Delegation.pm作爲文件。
謝謝!
當與Moose一起使用時,是否可以讓Log4perl正確顯示日誌事件的行號和包/類,而不是總是在第99行的方法::授權?如何使用Log4perl和Moose報告行號?
在我的情況下,我創建了一個屬性isa Log :: Log4perl :: Logger,並將各種日誌級別委託給我的類(日誌,警告,錯誤...)。這樣做也將Delegation.pm作爲文件。
謝謝!
你沒有提供足夠的信息來診斷你的問題(例如什麼是Method :: Delegation,它是如何連接到Log4perl的),但是我的spidey感覺告訴我你可能有一個包裝方法,你可以從中調用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,它絕對應該。
是的。根據Log::Log4perl::Layout::PatternLayout你想要的是%F
和%L
的組合。 %L
是「發出日誌語句的文件內的行號」,而%F
是「發生日誌事件的文件」。
或者,最簡單的方法是使用%l
這是:主叫 方法,接着是呼叫者源 文件名和 括號中的行號的
完全合格的名稱。
Doh!對不起,你是對的。忘了提及我的課是與穆斯寫的。 – user269820 2010-02-09 21:23:12
哈哈,那麼我的例子應該是當時的:) – Ether 2010-02-09 21:28:30