2017-01-04 1 views
0

Ich habe ein Stammverzeichnis, das mehrere Unterverzeichnisse enthält. Ich muss alle diese Unterverzeichnisse durchlaufen und seine Dateien verarbeiten. Ich verwende Log :: Log4perl, um während der Verarbeitung ausgegebene Nachrichten zu protokollieren. Es wird kein Multi-Processing/Forking verwendet.So beenden Sie ein Log :: Log4perl

So weit so gut, aber hier kommt der Knackpunkt: protokollierten Nachrichten während der Verarbeitung eines bestimmten Unterverzeichnis hat sich auf einem separaten log-Datei protokolliert werden, lokale auf das Unterverzeichnis.

suchte ich die Dokumentation von Log :: Log4perl (kein ‚beenden‘ dort gefunden werden können), die FAQ und das Netz aber nicht finden konnten, wie beenden ich den Logger, so kann ich wechseln ein anderes Unterverzeichnis und starten Sie die Protokollierung dort in eine andere Datei.

Irgendwelche Ideen?

Antwort

1

Loggers in Log4perl Steuer wenn eine Nachricht oder nicht (über Kategorien und Ebenen) angemeldet wird, während Appen steuern, wo eine Nachricht protokolliert wird, so in Ihrem Fall sollten Sie Ihre Appen in das Unterverzeichnis anzupassen Sie bearbeiten gerade, nicht Ihre Logger.

Normalerweise legt Log4perl seine Konfiguration beim Start fest und hält dann das Tauschverfahren unverändert, aber Sie können dies nicht in Ihrem Anwendungsfall tun, weil Sie nicht die Anzahl der verschiedenen Verzeichnisse kennen, auf die Sie stoßen werden (oder wollen sie nicht hart codieren), also müssen Sie Ihre Log4perl-Konfiguration dynamisch anpassen, während Sie durch die Verzeichnisse gehen.

Hier ist ein Proof of Concept, mit add_appender() und remove_appender() die gleiche Logger für das aktuell bearbeitete Verzeichnis zu konfigurieren:

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

Hoffnung, das hilft!

Verwandte Themen