1

どのパッケージ、サブ、行などから私に通知するロガーの役割 (Log::Dispatchouli を使用しますが、それは問題ではありません) を作成しようとしています。ログ メッセージを発行しています。当然callerで試してみたのですが、スタックがMooseのクラスでいっぱいで、状況によってフレーム数が変わってしまいます。MOP または Moose を使用して同様の情報を取得する方法はありますか? それとも、呼び出し元スタックをフィルタリングするモジュールがありますか? どうもありがとう!

package logger

sub log {...}

#some_package
log "bla"

#intended output
some_package l.12 bla
4

1 に答える 1

6

Carp の longmess 関数を使用して、スタック トレースを生成できます。文書化は不十分ですが、長い間存在しており、安全に使用できます。 cluckconfessはちょうどwarn longmessdie longmessそれぞれです。

使用する利点は、longmess()Carpが「内部」と見なすものを制御するためのグローバル変数がいくつかあることです。これにより、それらがスタック トレースに表示されなくなります。気になるのは@CARP_NOT%Carp::Internalです。どちらを使用するかは、ログの方法によって異なります。

@CARP_NOTを設定したパッケージから発生したスタック トレースのみに影響します@CARP_NOT。したがって、ロガーを次のように書くことができます。

package MyLogger;

use Carp;
our @CARP_NOT = qw(MyLogger Moose More::Moose::Stuff);

sub trace {
    # For example...
    warn Carp::longmess("Trace message");
}

MyLogger::trace()はトレースメッセージを報告する必要がありますが、それ自体、Moose、および に入力したものはすべて無視します@CARP_NOT

%Carp::Internalこれのグローバルバージョンのようなものです。Carp 関数が呼び出される場所をロギング パッケージに集中化できない場合は、パッケージを に追加できます%Carp::Internal。残念ながら、これはグローバルであり、グローバル変数を設定するすべての問題があります。それを台無しにする場合は、必ず のようにパッケージを追加して$Carp::Internal{"Some::Module"}++ください。のように上書きしないでください%Carp::Internal = ("Some::Module" => 1)

于 2012-12-15T21:35:25.070 に答える