Log4perl 拡張

use Data::Dumper をいちいち書くのが面倒なので Log4perl.pm に dumper メソッドを追加していたのですが、「Log4perl.pm を直接いじっちゃだめ〜」と怒られてしまったので、 Log4perl のアダプタークラスを書きました。これで $c->log->dumper("hoge object", $obj); できるようになります。

ちなみに Log4perl は想像どおり Log4jPerl 版です。詳しくは こちら

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