Как я могу сообщить номер строки с Log4perl и Moose? - PullRequest
3 голосов
/ 09 февраля 2010

Можно ли заставить Log4perl правильно отображать номер строки и пакет / класс события журнала вместо всегда Method :: Delegation в строке 99 при использовании с Moose?

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 09 февраля 2010

Вы не предоставляете почти достаточно информации для диагностики вашей проблемы (например, что такое Method :: Delegation и как он связан с Log4perl), но мои паучьи чувства говорят мне, что у вас, вероятно, есть метод-обертка, из которого вы вызываете Log4perl методы. Вам следует увеличить значение $Log::Log4perl::caller_depth из этой оболочки (и уменьшить его после вызова Log4perl), чтобы определить правильное местоположение.

например. в лося , я использую:

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 голосов
/ 10 февраля 2010

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

Или, самый простой способ - использовать %l, это:

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

...