Mooseで使用する場合、Log4perlに、常に行番号99のメソッド::委任ではなく、ログイベントの行番号とパッケージ/クラスを正しく表示させることは可能ですか?
私の場合、属性isa Log :: Log4perl :: Loggerを作成し、さまざまなログレベル(log、warn、error、...)をクラスに委任しました。これを行うと、Delegation.pmもファイルとして表示されます。
ありがとう!
問題を診断するのに十分な情報(たとえば、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をインクリメントしないことに注意してください。これは、間違いなく必要です。
はい。Log :: Log4perl :: Layout :: PatternLayoutによると、必要なのは%F
との組み合わせです%L
。%L
は「ログステートメントが発行されたファイル内の行番号」であり、%F
は「ログイベントが発生したファイル」です。
または、次のいずれかを使用するのが最も簡単な方法%l
です。
呼び出し元メソッドの完全修飾名とそれに続く呼び出し元は、ファイル名と括弧内の行番号をソースします。