Mooseのカスタム ログ ロールでこれを行います(関係のない複雑なコードは削除されています)。
package MyApp::Role::Log;
use Moose::Role;
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;
$Log::Log4perl::caller_depth += 4;
my $return = $this->$orig(@_);
$Log::Log4perl::caller_depth -= 4;
return $return;
} foreach @methods;
method _build__logger => sub {
my $this = shift;
my $loggerName = ref($this);
Log::Log4perl->easy_init() if not Log::Log4perl::initialized();
return Log::Log4perl->get_logger($loggerName)
};
ご覧のとおり、ログ オブジェクトは自己初期化されます。Log::Log4perl->init
呼び出されていない場合は、easy_init
呼び出されます。これを簡単に変更して、各モジュールがそのロガーをカスタマイズできるようにすることができますref($this)
。デフォルトのフォールバックとして、オプションの役割パラメーターを使用してそうします。
PS。MooseX::Log::Log4perlも参照してください。これは、上記のロガー ロールを使用する前に開始した場所です。いつの日か、私が追加したいくつかの機能を組み込むために、その MX モジュールに非常に必要なパッチをいくつか提出します。