2010-02-09 2 views
3

Возможно ли, чтобы Log4perl корректно отображал номер строки и пакет/класс журнала, а не всегда. Метод :: Делегирование в строке 99 при использовании с Moose?Как сообщить номер строки с помощью Log4perl и Moose?

В моем случае я создал атрибут isa Log :: Log4perl :: Logger и делегировал различные уровни ведения журнала в мой класс (журнал, предупреждение, ошибка, ...). Выполнение этого также показывает Delegation.pm в качестве файла.

Спасибо!

ответ

2

Вы не предоставляете достаточно информации для диагностики вашей проблемы (например, что такое метод :: Делегирование и как оно связано с 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, что он определенно должен.

+0

Doh! Извините, вы правы. Забыл упомянуть, что мой класс написан с Мусом. – user269820

+0

Ха, ну тогда мой пример должен быть на месте тогда :) – Ether

0

Да. Согласно Log::Log4perl::Layout::PatternLayout, вы хотите комбинировать %F и %L. %L - это «Номер строки в файле, в котором был выдан оператор журнала», а %F - это «Файл, в котором произошло событие регистрации».

Или, проще всего было бы использовать %l, который является:

Полного именем вызывающего метода с последующим источником вызывающих абонентов именем файла и номер строки между скобками.

Смежные вопросы