2014-09-12 38 views
1

我有一個Perl程序,其中必須有一組消息轉到屏幕(標準輸出),另一組轉到文件。我爲每個輸出創建了兩個記錄器:屏幕記錄器,然後是文件記錄器。當我創建屏幕記錄器並使用它時,消息確實出現在屏幕上。創建文件記錄器後,使用屏幕記錄器打印的消息不再出現在屏幕上。但是,使用文件記錄器時,消息確實出現在文件中。是Log :: Log4Perl屏幕記錄器在創建文件記錄器後停止工作

的伐木工人日誌:: Log4Perl配置如下:

# Screen configuration: 
my $screen_conf = q(
log4perl.logger.MyPackage       = DEBUG, Screen 
log4perl.appender.Screen       = Log::Log4perl::Appender::Screen 
log4perl.appender.Screen.stderr      = 1 
log4perl.appender.Screen.mode      = append 
log4perl.appender.Screen.layout      = Log::Log4perl::Layout::PatternLayout 
log4perl.appender.Screen.layout.ConversionPattern = %d %5p> %m%n 
); 

Log::Log4perl->init(\$screen_conf); 
$screen_logger = Log::Log4perl::get_logger('MyPackage'); 

# Messages do appear on the screen: 
$screen_logger->debug('Some more test text'); 

# File configuration: 
my $file_conf = q(
log4perl.logger.MyPackage       = DEBUG, LogFile 
log4perl.appender.LogFile       = Log::Log4perl::Appender::File 
log4perl.appender.LogFile.filename     = mylogfile.log 
log4perl.appender.LOG.mode       = append 
log4perl.appender.LogFile.layout     = Log::Log4perl::Layout::PatternLayout 
log4perl.appender.LogFile.layout.ConversionPattern = %d %5p> %m%n 
); 

Log::Log4perl->init(\$file_conf); 
$sfile_logger = Log::Log4perl::get_logger('MyPackage'); 

# Messages do not appear on the screen now: 
$screen_logger->debug('Some more test text'); 

# Messages do appear in the file: 
$screen_logger->debug('Some more test text'); 

我已經追查直通代碼,檢查返回值,並且仍然沒有發現這個問題可能是什麼。關於什麼問題可能由(或此時的答案)引起的建議將不勝感激。

在此先感謝...

==================================== ==============================

環境信息:我在Windows 7和8上使用Perl v5.16.3。包括指令,幷包括如下:

#****************************************************************************; 
# Compiler directives 
#****************************************************************************; 
use strict; 
use warnings; 
use diagnostics; 

#****************************************************************************; 
# Module includes 
#****************************************************************************; 
use Data::Dumper; 
use DBI; 
use File::Basename qw(fileparse fileparse_set_fstype); 
use File::Spec; 
use Getopt::Long; 
use Log::Log4perl; 
use Readonly; 
use Time::Piece; 
use version; 
+0

爲什麼2個獨立的記錄器對象?你是否總是希望向兩個地方傳遞相同的信息? – 2014-09-12 17:00:24

+1

你的屏幕輸出進入stderr,而不是stdout。 – toolic 2014-09-12 17:24:36

+0

有兩個記錄器的簡短答案是,其中一個是客戶想要通過不同記錄的程序進行記錄,而另外兩個客戶不想安裝模塊,比如稍後在程序流程中添加appender 。最簡單的答案就是客戶需要的是什麼。 – parramorej 2014-09-13 23:09:38

回答

1

init第二呼叫覆蓋第一個呼叫。

在具有不同記錄器名稱相同的變量聲明這兩種構型:

use warnings; 
use strict; 
use Log::Log4perl qw(get_logger); 

my $conf = q(
log4perl.logger.MyPackage       = DEBUG, Screen 
log4perl.appender.Screen       = Log::Log4perl::Appender::Screen 
log4perl.appender.Screen.stderr      = 1 
log4perl.appender.Screen.mode      = append 
log4perl.appender.Screen.layout      = Log::Log4perl::Layout::PatternLayout 
log4perl.appender.Screen.layout.ConversionPattern = %d %5p> %m%n 

log4perl.logger.MyPackagef       = DEBUG, LogFile 
log4perl.appender.LogFile       = Log::Log4perl::Appender::File 
log4perl.appender.LogFile.filename     = mylogfile.log 
log4perl.appender.LOG.mode       = append 
log4perl.appender.LogFile.layout     = Log::Log4perl::Layout::PatternLayout 
log4perl.appender.LogFile.layout.ConversionPattern = %d %5p> %m%n 
); 

Log::Log4perl->init(\$conf); 
my $screen_logger = Log::Log4perl::get_logger('MyPackage'); 

# Messages do appear on the screen: 
$screen_logger->debug('Some more test text'); 

my $sfile_logger = Log::Log4perl::get_logger('MyPackagef'); 

# Messages do appear on the screen now: 
$screen_logger->debug('Some more test text 2'); 

# Messages do appear in the file: 
$sfile_logger->debug('Some more test text file'); 
+0

嗯,我寫了一個錯誤:日誌配置實際上是不同的(在不同子程序中使用「my」作爲範圍)。標準輸出記錄器在一個子例程中初始化,文件記錄器在另一個子例程中初始化。 – parramorej 2014-09-13 22:57:49

+0

關於引用被保留在某個我沒有跟蹤的地方的變化,我會嘗試它......謝謝。 – parramorej 2014-09-13 23:12:39

+1

這將工作---謝謝。在文檔中仔細閱讀這些內容也會對我有所幫助:「僅初始化一次 - 認識到Log :: Log4perl一次只能初始化一次,通常在程序或系統啓動時很重要。調用init ()不止一次會導致它摧毀現有配置並將其替換爲新配置。「 – parramorej 2014-09-15 21:23:00