2010-02-09 45 views
3

當與Moose一起使用時,是否可以讓Log4perl正確顯示日誌事件的行號和包/類,而不是總是在第99行的方法::授權?如何使用Log4perl和Moose報告行號?

在我的情況下,我創建了一個屬性isa Log :: Log4perl :: Logger,並將各種日誌級別委託給我的類(日誌,警告,錯誤...)。這樣做也將Delegation.pm作爲文件。

謝謝!

回答

2

你沒有提供足夠的信息來診斷你的問題(例如什麼是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,它絕對應該。

+0

Doh!對不起,你是對的。忘了提及我的課是與穆斯寫的。 – user269820 2010-02-09 21:23:12

+0

哈哈,那麼我的例子應該是當時的:) – Ether 2010-02-09 21:28:30

0

是的。根據Log::Log4perl::Layout::PatternLayout你想要的是%F%L的組合。 %L是「發出日誌語句的文件內的行號」,而%F是「發生日誌事件的文件」。

或者,最簡單的方法是使用%l這是:主叫 方法,接着是呼叫者源 文件名和 括號中的行號的

完全合格的名稱。