2014-09-12 76 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