DBIなどのいくつかのユーティリティクラス内でロギングを採用したいと思います。Log :: Log4perlでそれを行うためのベストプラクティスは何ですか?
DBI(たとえばMyDBI
)をサブクラス化し、そこでいくつかのメソッドをオーバーライドして、ロギングを実行させるのは問題ないと思います。しかし、カテゴリには問題があります。でロガーを作成する場合
Log::Log4perl->get_logger(ref $self || $self)
その場合、すべてのログエントリが属し、MyDBI
それらをフィルタリングするのは困難です。MyDBI
したがって、呼び出し側モジュール(たとえば)からロガーを渡す方が良いように思われMyModule
ます。そうすれば、カテゴリーは意味的に正しくなります。最初の質問、それは一般的に大丈夫ですか?つまり、そのようなアプローチに関して隠されたサンゴ礁はありますか?
2番目の質問、ロガーを渡す方法はMyDBI
?グローバル変数を宣言するアイデアがあります。たとえば$MyDBI::logger
、呼び出し元のメソッドで設定します。
local $MyDBI::logger = Log::Log4perl->get_logger(ref $self || $self);
グローバル変数には伝統的な嫌悪感があります。もっと良い方法を考えられますか?
編集:もちろん、最良のコードはコードなしです。caller
継承を考慮に入れれば十分でしょう。
3番目の質問は、両方のカテゴリにログインすることは可能MyDBI
ですMyModule
か。階層的に関連がない場合は、Log :: Log4perlを使用してログインできますか?