parramorej
parramorej

Reputation: 33

Log::Log4Perl screen logger stops working after creating a file logger

I have a Perl program in which I have to have one set of messages go to the screen (stdout) and another set go to a file. I create two loggers for each of those outputs: the screen logger first, then the file logger. When I create the screen logger and use it, messages do appear on the screen. After I create the file logger, messages printed using the screen logger no longer appear on the screen. When using the file logger, however, messages do appear in the file.

The Log::Log4Perl configurations for the loggers are as follows:

# 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');

I have traced thru the code, checked return values, and still have not found what the problem could be. Suggestions as to what the problem might be caused by (or an answer, at this point) would be appreciated.

Thanks in advance...

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

Environment information: I am using Perl v5.16.3 on Windows 7 and 8. Directives and includes are as follows:

#****************************************************************************;
# 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;

Upvotes: 1

Views: 653

Answers (1)

toolic
toolic

Reputation: 62083

The second call to init overrides the first call.

Declare both configurations in the same variable with different logger names:

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');

Upvotes: 1

Related Questions