0

内部にLog4Perlを使用して抽象化関数を作成すると$logger->error_die($m)、関数の場所ではなく、行の行番号が出力されfatalError()ます。

sub fatalError {
    my $m = shift;
    email($m, $c->{subject});
    unlink $c->{lock};
    $logger->error_die($m);
}

fatalError("Directory $d ...");

Bashでは、各エラーメッセージの最後に書くことで問題を解決し、病棟の後にBashスクリプトを解析して一意の番号[###]に置き換えました。[###]そうすれば、エラー出力がどこから来たのか正確にわかりました。ただし、2 番目のスクリプトでソース コードを変更するのは最適ではありません。

質問

Log4Perl私の関数が呼び出された行番号を書かなけれfatalError()ばならない方法はありますか、または問題をどのように解決する必要がありますか?

4

4 に答える 4

3

callerを使用して、サブルーチンより上のレベルの詳細を取得できます。

ただし、コード参照を使用して Log4perl メソッドを呼び出すこともできます。必要な追加処理を行い、好きなメッセージを返します。

$logger->error_die( sub { ... do some stuff ...; $log_message } );

電子メールのビットについては、それを処理するために別のアペンダーを追加すると思います。

于 2014-07-30T13:56:04.127 に答える
2

fatalError簡単な方法は、次の行をメソッドに追加することです。

local $Log::Log4perl::caller_depth++;

これにより、Log4perl は現在のサブルーチンを呼び出し元のコンテキストから「スキップ」します。

または、そのようなラッパー メソッドが多数ある場合は、それらを 1 つのパッケージにカプセル化し、次のように Log4perl に登録します。

Log::Log4perl->wrapper_register('My::Logger');

このトピックはLog::Log4perl ドキュメントで説明されています。

于 2014-07-30T15:47:54.293 に答える
1

Log4Perl のソース コードを覗いてみると、改行で終わらないメッセージにのみ位置情報を追加するというwarn/規則を尊重しているように見えます。dieつまり、関数を介して場所を追加し、Log4Perl が追加するのを停止できます。

sub fatalError {
    my $m = shift;
    my (undef, $file, $line) = caller;
    my $at = " at $file line $line.\n";
    email($m, $c->{subject});
    unlink $c->{lock};
    $logger->error_die($m . $at);
}
于 2014-07-30T13:58:52.683 に答える