0

我有一个包含多个子目录的根目录。我需要遍历所有这些子目录并处理它的文件。我使用 Log::Log4perl 来记录处理过程中发出的消息。不使用多处理/分叉。

到目前为止一切顺利,但关键来了:在处理给定子目录期间发出的日志消息必须记录到子目录本地的单独日志文件中。

我搜索了 Log::Log4perl 的文档(那里找不到“终止”)、常见问题解答和网络,但找不到如何终止记录器,所以我可以切换到另一个子目录并重新开始记录到另一个文件。

有任何想法吗?

4

1 回答 1

1

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( ) );
}

希望有帮助!

于 2017-01-15T20:01:01.493 回答