2017-01-04 4 views
0

У меня есть корневой каталог, который содержит несколько подкаталогов. Мне нужно пройти все эти подкаталоги и обработать его файлы. Я использую Log :: Log4perl для регистрации сообщений, выпущенных во время обработки. Не используется многопроцессорная обработка/forking.Как закончить журнал :: Log4perl

До сих пор так хорошо, но здесь идет сообщение: зарегистрированные сообщения, выданные во время обработки данного подкаталога, должны быть записаны в отдельный файл журнала, local в подкаталог.

Я искал документацию бревенчатого :: Log4perl (нет «прекратить» можно найти здесь), часто задаваемые вопросы и сети, но не смог найти как я прекратить регистратор, так что я могу перейти на другой подкаталог и перезапустить его в другом файле.

Любые идеи?

ответ

1

Лесорубы в управлении Log4perl если сообщение получает вошедшее или нет (с помощью категорий и уровней), в то время как appenders управления где сообщение получает регистрируются, поэтому в вашем случае, если вы хотите, чтобы адаптировать свои appenders подкаталога вы в настоящее время обрабатываете, а не ваши регистраторы.

Обычно 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()); 
} 

Надежда, что помогает!