我有一个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;
为什么2个独立的记录器对象?你是否总是希望向两个地方传递相同的信息? – 2014-09-12 17:00:24
你的屏幕输出进入stderr,而不是stdout。 – toolic 2014-09-12 17:24:36
有两个记录器的简短答案是,其中一个是客户想要通过不同记录的程序进行记录,而另外两个客户不想安装模块,比如稍后在程序流程中添加appender 。最简单的答案就是客户需要的是什么。 – parramorej 2014-09-13 23:09:38