2016-11-03 1 views
4

Je suis nouveau sur Log4perl et j'essaie de comprendre pourquoi j'ai deux enregistreurs différents dans la configuration ci-dessous. Ma compréhension est que cela devrait être un singleton et l'appel get_logger() retournerait la même instance de l'objet à chaque fois.Utilisation de Log4perl Singleton

Test.pm

#!/usr/bin/perl 

package Example::Test; 
use strict; 
use warnings; 
use Exporter; 
our @ISA = qw(Exporter); 
our @EXPORT = qw(test); 

sub test 
{ 
    my $logger = Log::Log4perl->get_logger(); 
    print $logger, "\n"; 
} 

test.pl

#!/usr/bin/perl 

use strict; 
use warnings; 
use Log::Log4perl; 
use Example::Test; 

# Logger configuration 
Log::Log4perl->init('/etc/log4perl.conf'); 
my $logger = Log::Log4perl->get_logger(); 
print $logger, "\n"; 

my $engine = test(); 

Sortie

Log::Log4perl::Logger=HASH(0x12093d0) 
Log::Log4perl::Logger=HASH(0x29b4950) 

Répondre

3

Vous ne spécifiez pas l'exploitation forestière catégorie, de sorte que votre code fait l'équivalent de

Log::Log4perl->get_logger(__PACKAGE__); 

__PACKAGE__ est Example::Test dans votre module et main dans votre script.

De l'documentation:

Catégories sont également appelés « Bûcherons » dans Log4perl, désignent la même chose et ces termes sont utilisés de façon interchangeable.Log::Log4perl utilise catégories pour déterminer si une instruction de journal dans un composant doit être exécutée ou supprimée au niveau de journalisation en cours. La plupart du temps, ces catégories ne sont que les classes les déclarations de journaux se trouvent dans ...

En général, vous voulez probablement un enregistreur séparé pour chaque module afin que vous puissiez gérer les messages du journal de différentes parties de votre code de base différemment.


D'autre part, si Example::Test est censé être un wrapper pour Log :: Log4perl, register it:

package My::Wrapper; 

use strict; 
use warnings 'all'; 
use 5.010; 

use Log::Log4perl; 

Log::Log4perl->wrapper_register(__PACKAGE__); 

sub foo { 
    my $logger = Log::Log4perl->get_logger; 

    say $logger; 
    $logger->warn('foo'); 
} 

1; 

Lorsque vous appelez My::Wrapper::foo() du package main, la catégorie de l'exploitation forestière sera main::.