3

私はぼんやりしていて明らかなことを見逃していると確信していますが、サブルーチン呼び出しに頼ることなく、構成ファイルのファイル名として現在のカテゴリを使用する簡単な方法はありますか?

次のファイル名の行${category}.logで繰り返す代わりに使用できるようにbin.nh.tpp

log4perl.logger.**bin.nh.tpp**=INFO, BIN_NH_TPP_LOGFILE

log4perl.appender.BIN_NH_TPP_LOGFILE=Log::Log4perl::Appender::File
log4perl.appender.BIN_NH_TPP_LOGFILE.filename=${LOGS}/nh/**bin.nh.tpp**.log
log4perl.appender.BIN_NH_TPP_LOGFILE.mode=append
log4perl.appender.BIN_NH_TPP_LOGFILE.layout=PatternLayout
log4perl.appender.BIN_NH_TPP_LOGFILE.layout.ConversionPattern=[%d] %F{1} %L %c - %m%n
4

1 に答える 1

1

残念ながら、これはサブルーチンよりもやや複雑です。l4p conf ファイルのサブルーチンを使用すると、conf ファイルの解析時に既知の変数 (時刻/日付やユーザー ID など) を含めることができます。そのようにログ時間の動作を変更することはできません。

あなたが望むものを達成するために私が今考えることができる最も簡単な方法は、次のようなカスタムアペンダーです

package FileByCategoryAppender;

use warnings;
use strict;
use base qw( Log::Log4perl::Appender::File );

sub new {
    my( $class, %options ) = @_;

    $options{filename } = "no-category.log";
    my $self = $class->SUPER::new( %options );
    bless $self, $class;
}

sub log {
    my( $self, %params ) = @_;

    my $category = $params{ log4p_category };
    $self->SUPER::file_switch( $category . ".log" );
    $self->SUPER::log( %params );
}

1;

そして、次のようにスクリプトで使用します

use strict;
use warnings;

use Log::Log4perl qw( get_logger );

my $conf = q(
log4perl.category         = WARN, Logfile
log4perl.appender.Logfile = FileByCategoryAppender
log4perl.appender.Logfile.create_at_logtime = 1
log4perl.appender.Logfile.layout = \
  Log::Log4perl::Layout::PatternLayout
log4perl.appender.Logfile.layout.ConversionPattern = %d %F{1} %L> %m %n
);

Log::Log4perl::init(\$conf);

my $logger = get_logger("Bar::Twix");
$logger->error("twix error");

$logger = get_logger("Bar::Mars");
$logger->error("mars error");

これにより、ログ時に次の 2 つのログ ファイルが作成されます。

# Bar.Mars.log
2012/11/18 11:12:12 t 21> mars error

# Bar.Twix.log
2012/11/18 11:12:12 t 21> twix error
于 2012-11-18T19:24:41.740 に答える