2017-05-01 1 views
4

J'ai un script Perl qui produit deux flux de données différents.Comment puis-je me connecter à deux fichiers différents dans Log4perl?

Je dois les enregistrer dans deux fichiers journaux distincts.

Je suis au courant de 2 approches qui conduisent à des fichiers journaux, mais ni l'un semble utile dans ma situation:

  1. catégories à l'aide (qui sont des noms de modules Perl). Dans mon cas, les flux sont tous deux produits dans le même code (paquet "principal", mais ce n'est pas important, ce qui compte, c'est que littéralement j'ai des lignes de code côte à côte sur 2 emplacements qui ne peuvent pas être séparé en différents modules Perl).

  2. Utilisation de différents niveaux de journaux.

    Cependant, les deux doivent se connecter avec la même priorité (par exemple les deux sont l'exploitation forestière info() appels et error() selon le cas), donc je ne peux pas utiliser la recette FAQ pour logging WARN/ERROR to different files.

+0

De plus, les messages ne sont pas des modèles spécifiques, donc en utilisant des filtres personnalisés avec une expression régulière ne fonctionnerait pas aussi loin comme je peux le voir. – DVK

Répondre

2

Categories dans Log4perl sont arbitraires et ne sont pas liées à la hiérarchie des classes de votre application.

use strict; 
use warnings; 

use Log::Log4perl qw(get_logger); 

my $conf = q(
log4perl.category.first = DEBUG, FileAppender1 
log4perl.category.second = DEBUG, FileAppender2 

log4perl.appender.FileAppender1   = Log::Log4perl::Appender::File 
log4perl.appender.FileAppender1.filename = first.log 
log4perl.appender.FileAppender1.layout = Log::Log4perl::Layout::SimpleLayout 

log4perl.appender.FileAppender2   = Log::Log4perl::Appender::File 
log4perl.appender.FileAppender2.filename = second.log 
log4perl.appender.FileAppender2.layout = Log::Log4perl::Layout::SimpleLayout 
); 

Log::Log4perl::init(\$conf); 

my $logger1 = get_logger('first'); 
my $logger2 = get_logger('second'); 

$logger1->debug('foo'); 
$logger2->info('bar'); 
$logger1->error('baz'); 

first.log

DEBUG - foo 
ERROR - baz 

second.log

INFO - bar