2011-09-27 56 views
4

我打算在我的模塊中使用Log4Perl進行日誌記錄。如何在Perl中的模塊中使用Log4Perl?

我的代碼結構是這樣的

我有Start.PL它驗證一些參數。我有幾個模塊(PM),這是相通的),它創建日誌對象文件(在這些PL和PM文件中使用)

我有一個Logger.PM中,我有一個方法InitiateLogger(

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

我把這種方法Logger::InitiateLogger();在Start.pl

這裏是我的問題

  1. 我如何可以使用相同的$日誌跨模塊(PM文件)
  2. 我是否需要爲此使用相同的包名?

如果有人澄清我這些問題,會不錯。

回答

4

您可以宣告$logour包變量,並使用你需要的地方,使用它的詳細全稱。例如:

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需要記錄器的每個軟件包中製作一個別名。

+0

對不起,它的工作原理:-)我的錯誤。感謝您花時間解釋 – KK99

+0

不客氣^ _ ^。 –

0

使用全局變量,如,

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

所以,你可以訪問變量$主::跨模塊任何地方登錄。因爲它將保留在命名空間中。

+0

請問您能解釋一下嗎?不知何故,我沒有得到點 – KK99

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()。這將返回一個與當前軟件包名稱綁定的記錄器,因此您可以在配置文件中打開或關閉該軟件包的記錄器。

+0

從來不知道它是辛格爾頓。感謝這一點。會檢查你的建議。 – KK99

相關問題