如何终止Log :: Log4perl

时间:2017-01-04 21:37:32

标签: logging log4perl

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

到目前为止一切顺利,但问题就在于:在处理给定子目录期间发出的记录消息必须记录到单独的日志文件 local 到子目录。

我搜索了Log :: Log4perl的文档(没有'终止'可以在那里找到),FAQ和网络但找不到 如何终止记录器 < / strong>,所以我可以切换到另一个子目录并重新开始记录到另一个文件。

有什么想法吗?

1 个答案:

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

希望有所帮助!