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」のようにリモートアドレスごとにデバッグファイルが吐かれるようになります。