Log :: Log4Perl屏幕记录器在创建文件记录器后停止工作

时间:2014-09-12 16:32:06

标签: perl file logging screen log4perl

我有一个Perl程序,我必须将一组消息转到屏幕(stdout),另一组转到文件。我为每个输出创建了两个记录器:首先是屏幕记录器,然后是文件记录器。当我创建屏幕记录器并使用它时,屏幕上会显示消息。创建文件记录器后,使用屏幕记录器打印的消息不再出现在屏幕上。但是,使用文件记录器时,消息会出现在文件中。

记录器的Log :: 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;

1 个答案:

答案 0 :(得分: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');