3

Mooseで使用する場合、Log4perlに、常に行番号99のメソッド::委任ではなく、ログイベントの行番号とパッケージ/クラスを正しく表示させることは可能ですか?

私の場合、属性isa Log :: Log4perl :: Loggerを作成し、さまざまなログレベル(log、warn、error、...)をクラスに委任しました。これを行うと、Delegation.pmもファイルとして表示されます。

ありがとう!

4

2 に答える 2

2

問題を診断するのに十分な情報(たとえば、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をインクリメントしないことに注意してください。これは、間違いなく必要です。

于 2010-02-09T20:59:26.757 に答える
0

はい。Log :: Log4perl :: Layout :: PatternLayoutによると、必要なのは%Fとの組み合わせです%L%Lは「ログステートメントが発行されたファイル内の行番号」であり、%Fは「ログイベントが発生したファイル」です。

または、次のいずれかを使用するのが最も簡単な方法%lです。

呼び出し元メソッドの完全修飾名とそれに続く呼び出し元は、ファイル名と括弧内の行番号をソースします。

于 2010-02-10T00:07:46.513 に答える