Log4perl 拡張
use Data::Dumper をいちいち書くのが面倒なので Log4perl.pm に dumper メソッドを追加していたのですが、「Log4perl.pm を直接いじっちゃだめ〜」と怒られてしまったので、 Log4perl のアダプタークラスを書きました。これで $c->log->dumper("hoge object", $obj); できるようになります。
ちなみに Log4perl は想像どおり Log4j の Perl 版です。詳しくは こちら。
package MyApp::Log4perlAdapter;
use strict;
use warnings;
use base qw(Catalyst::Log::Log4perl);
use Data::Dumper;
=head1 NAME
Log4perlAdapter - Log4perl Adapter
=head1 SYNOPSIS
$c->log->dumper("this is user list", @user_list);
=head1 DESCRIPTION
added dumper method.
=head1 METHODS
=head2 dumper
=cut
sub dumper {
my ($self, $message, @datas) = @_;
my $result = $self->debug($message);
foreach my $data (@datas) {
$self->debug(Dumper($data));
}
return $result;
}
1;ちなみに各アプリケーションで Log4perl を使うための設定はこちら。
package MyApp;
sub auto : Private {
my ($self, $c) = @_;
# log4perlの設定
my $addr = $ENV{'REMOTE_ADDR'};
my $conf = "
log4perl.rootLogger=DEBUG, LOGFILE
log4perl.appender.LOGFILE=Log::Log4perl::Appender::File
log4perl.appender.LOGFILE.filename=/tmp/MyApp.$addr
log4perl.appender.LOGFILE.mode=append
log4perl.appender.LOGFILE.layout=PatternLayout
log4perl.appender.LOGFILE.layout.ConversionPattern=%d [%C:%M:%L] %m%n
";
MyApp->log(MyApp::Log4perlAdapter->new(\$conf));
#MyApp->log(MyApp::Log4perlAdapter->new('/etc/log4perl.conf'));
}例では「/tmp/MyApp.210.97.10.1」のようにリモートアドレスごとにデバッグファイルが吐かれるようになります。