我有一个包含多个子目录的根目录。我需要遍历所有这些子目录并处理其文件。我使用Log :: Log4perl来记录处理过程中发出的消息。没有使用多处理/分叉。
到目前为止一切顺利,但问题就在于:在处理给定子目录期间发出的记录消息必须记录到单独的日志文件 local 到子目录。
我搜索了Log :: Log4perl的文档(没有'终止'可以在那里找到),FAQ和网络但找不到 如何终止记录器 < / strong>,所以我可以切换到另一个子目录并重新开始记录到另一个文件。
有什么想法吗?
答案 0 :(得分:1)
Log4perl中的记录器控制如果记录消息(通过类别和级别),而appenders控制 记录消息,所以在你的情况下你'我想让您的appender适应您当前正在处理的子目录,而不是您的记录器。
通常,Log4perl在开始时设置其配置,然后保持未修改状态,但是你不能在你的用例中这样做,因为你不知道你预先遇到的不同目录的数量(或者不想对它们进行硬编码),因此您需要在遍历目录时动态调整Log4perl配置。
这是一个概念验证,使用add_appender()和remove_appender()为当前处理的目录配置相同的记录器:
use warnings;
use strict;
use Log::Log4perl qw(get_logger :levels);
my @dirs = qw( foo bar baz foo bar baz );
my $logger = get_logger();
$logger->level( $INFO );
for my $dir ( @dirs ) {
if( ! -d $dir ) {
mkdir $dir or die "$dir: $!";
}
my $appender = Log::Log4perl::Appender->new(
"Log::Log4perl::Appender::File",
name => "file-$dir",
filename => "$dir/test.log",
layout => Log::Log4perl::Layout::SimpleLayout->new( ),
mode => "append",
);
$logger->add_appender( $appender );
$logger->info( "hello there in $dir" );
$logger->remove_appender( $appender->name( ) );
}
希望有所帮助!