2016-11-03 3 views
4

私はLog4perlを初めて使い、以下のセットアップで2つの異なるロガーを得る理由を理解しようとしています。私はこれがシングルトンでなければならないと理解しており、get_logger()を呼び出すと毎回同じインスタンスが返されます。Log4perlシングルトンの使用

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

出力

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

答えて

3

あなたはロギングを指定していませんでしたカテゴリ、あなたのコードは__PACKAGE__があなたのモジュールと、スクリプト内のmain内部Example::Testある

Log::Log4perl->get_logger(__PACKAGE__); 

の同等を行いますので。 documentationから

カテゴリーもLog4perlで、「ロガー」と呼ばれているが、両方とも同じものを指し、これらの用語は互換的に使用されます。Log::Log4perlカテゴリを使用して、コンポーネントのログステートメントを現在のログレベルで実行または抑制する必要があるかどうかを判断します。たいていの場合、これらのカテゴリは、ログステートメントが配置されているクラスだけです。

一般に、各モジュールに別々のロガーが必要なので、コードベースのさまざまな部分からログメッセージを処理できます異なっている。一方


Example::Testはログイン:: 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; 

あなたがパッケージmainからMy::Wrapper::foo()を呼び出すと、ログカテゴリがmain::になります。

関連する問題