恐怕它比子程序更复杂。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");
这将导致在日志时创建两个日志文件:
# 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