2011-09-08 3 views
2

J'ai essayé de mettre en place deux appenders, mais il semble que pour écrire STDERR:Comment log4perl peut-il écrire dans STDERR et dans un fichier en même temps?

my $header = "######$scriptname $version"; 
use Log::Log4perl qw(:easy); 
Log::Log4perl->easy_init($DEBUG); 
my $logger = get_logger(); 
my $layout = Log::Log4perl::Layout::PatternLayout->new(
"%d %p> %F{1}:%L %M - %m%n"); 
my $appender = Log::Log4perl::Appender->new(
     "Log::Dispatch::File", 
     filename=>$scriptname.".log", 
     mode => "append" 
); 
$appender->layout($layout); 
my $stderr = Log::Log4perl::Appender::Screen->new(
     stderr =>0, 
     ); 

$stderr->layout($layout); 
$logger->info($header); 

Répondre

5

Ce n'est pas une bonne idée de mélanger easy_init avec appenders personnalisés. Vous pouvez résoudre ce problème en ajoutant l'appender à l'enregistreur $logger->add_appender($appender). Mais cela entraînera des messages en double, car vous avez déjà défini l'appender dans easy_init.

Je vous suggère d'utiliser la configuration à la place. Vous pouvez intégrer la configuration dans votre code:

use strict; use warnings; 

use Log::Log4perl; 

Log::Log4perl->init(\<<CONFIG); 
log4perl.rootLogger = DEBUG, screen, file 

log4perl.appender.screen = Log::Log4perl::Appender::Screen 
log4perl.appender.screen.stderr = 0 
log4perl.appender.screen.layout = PatternLayout 
log4perl.appender.screen.layout.ConversionPattern = %d %p> %F{1}:%L %M - %m%n 

log4perl.appender.file = Log::Log4perl::Appender::File 
log4perl.appender.file.filename = 1.log 
log4perl.appender.file.mode = append 
log4perl.appender.file.layout = PatternLayout 
log4perl.appender.file.layout.ConversionPattern = %d %p> %F{1}:%L %M - %m%n 
CONFIG 

my $logger = Log::Log4perl->get_logger(); 
$logger->info("my message"); 
+0

oui je peux voir easy_init n'est pas pour moi dans ce cas. Tout cela a bien fonctionné, sauf que je n'ai pas réussi à faire fonctionner votre CONFIG embarqué - j'ai utilisé un quoteliste et je l'ai juste mis dans init. Merci! – shigeta

2

La documentation Log :: Log4Perl a la réponse à mi-chemin à travers la section 'furtif Logger': http://search.cpan.org/~mschilli/Log-Log4perl-1.49/lib/Log/Log4perl.pm#Stealth_loggers

use Log::Log4perl qw(:easy); 

Log::Log4perl->easy_init({ level => $DEBUG, 
          file  => ">>test.log", 
          layout => '%F{1}-%L-%M: %m%n' }, 
          { level => $DEBUG, 
          file  => "STDOUT", 
          layout => '%m%n' }, 
         ); 

J'ai eu la même question. .. même 5 ans après cela a été posté, il est toujours sur la première page de Google lors de la recherche "perl log4perl écrire dans le fichier et l'écran"

Questions connexes