我有一个根目录,其中包含多个子目录。我需要遍历所有这些子目录并处理它的文件。我使用Log::Log4perl记录处理期间发出的消息。不使用多处理/分叉。
到目前为止还不错,但关键在于:在处理给定子目录期间发出的日志消息必须记录到单独的日志文件中,这是子目录的本地日志文件。
我搜索了Log::Log4perl的文档(在那里找不到‘终止’)、FAQ和网络,但是找不到--如何终止记录器,这样我就可以切换到另一个子目录,并在那里重新启动日志到另一个文件。
有什么想法吗?
发布于 2017-01-15 20:01:01
如果(通过类别和级别)记录或不记录消息,则Log4perl中的记录器控制,而附加程序则控制记录消息的,因此在您的示例中,您希望使添加程序适应当前正在处理的子目录,而不是记录器。
通常,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( ) );
}希望这能帮上忙!
https://stackoverflow.com/questions/41473639
复制相似问题