4

ロギング用のモジュールで Log4Perl を使用する予定です。

私のコード構造は次のようになります

いくつかのパラメーターを検証する Start.PL があります。相互にリンクされたいくつかのモジュール (PM) ファイルがあります (これらの PL ファイルと PM ファイルで使用されます)。

ログオブジェクトを作成するメソッド InitiateLogger() がある Logger.PM があります

 $log    = Log::Log4perl->get_logger("MyLog");

Logger::InitiateLogger();Start.pl でこのメソッドを呼び出します

ここに私の質問があります

  1. モジュール間で同じ $log を使用するにはどうすればよいですか (PM ファイル)
  2. これには同じパッケージ名を使用する必要がありますか?

誰かが私にこれらの点を明確にするといいでしょう。

4

3 に答える 3

4

実際、Log4perlの動作方法(シングルトン)では、get_logger()は、プログラム内のどこから呼び出されても、まったく同じオブジェクトを返します。

use Log::Log4perl qw(:easy);
Log::Log4perl->easy_init( $ERROR );

print Log::Log4perl->get_logger("MyLog"), "\n";

package Some::Other::Package;

print Log::Log4perl->get_logger("MyLog"), "\n";

これは(例えば)印刷します:

Log::Log4perl::Logger=HASH(0x15a9d48)
Log::Log4perl::Logger=HASH(0x15a9d48)

したがって、すべてのモジュールで同じ$ logを使用する場合は、それらの各モジュールでget_logger( "MyLog")を呼び出すだけです。

ただし、特定のモジュールでロギングをオンまたはオフにできるようにする場合は、引数なしでget_logger()を呼び出すだけの方がよいでしょう。これにより、現在のパッケージ名に関連付けられたロガーが返されるため、構成ファイルでそのパッケージのロガーをオンまたはオフにすることができます。

于 2011-09-28T09:06:01.923 に答える
4

$log詳細な完全修飾名を使用して、パッケージ変数として宣言し、our必要な場所でインスタンスを使用できます。

Package::Name::$log->info( 'test' );

完全修飾名の代わりに、型グロブの割り当て後にエイリアスを使用できます。

#!/usr/bin/env perl

package Package::Name;

use strict;
use Log::Log4perl qw(:easy);
Log::Log4perl->easy_init( $ERROR );
our $log = get_logger();

package main;

use v5.12;
use strict;

*log = $Package::Name::log;
say $log;

これにより、次の結果が得られます。

Log::Log4perl::Logger=HASH(0x230ff20)

あなたの場合、Start.pl のロガー オブジェクトの完全修飾名は です$main::log。を使用して、ロガーが必要なすべてのパッケージでエイリアスを作成できます*log = $main::log

于 2011-09-27T12:47:47.807 に答える
0

次のようなグローバル変数を使用します。

$main::log = Log::Log4perl->get_logger("MyLog");

したがって、モジュール全体のどこからでも変数 $main::log にアクセスできます。名前空間で維持されるためです。

于 2011-09-27T12:33:49.567 に答える