2014-09-12 2 views
1

У меня есть программа Perl, в которой у меня должен быть один набор сообщений на экран (stdout), а другой набор - в файл. Я создаю два регистратора для каждого из этих выходов: сначала регистратор экрана, затем регистратор файлов. Когда я создаю регистратор экрана и использую его, на экране появляются сообщения. После создания регистратора файлов сообщения, напечатанные с помощью регистратора экрана, больше не отображаются на экране. Однако при использовании регистратора файлов в файле появляются сообщения.Log :: Log4Perl screen logger перестает работать после создания регистратора файлов

ТЕКУЩ :: 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'); 

Я прослежена через код, проверенные возвращаемые значения, и до сих пор не нашли то, что может быть проблема. Предложения по поводу того, что проблема может быть вызвана (или ответом, на данном этапе), будут оценены.

Заранее спасибо ...

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

Информация об окружающей среде: Я использую Perl v5.16.3 для Windows 7 и 8. Директивы и включает в себя следующие:

#****************************************************************************; 
# 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 отдельные объекты регистратора? Вы всегда хотите, чтобы одно и то же сообщение направлялось в оба места? –

+1

Ваш экран выводится на stderr, а не на stdout. – toolic

+0

Короткими ответами на то, что два регистратора - это то, что клиент хочет, чтобы сообщения через программу регистрировались по-разному, и, во-вторых, клиент не хочет устанавливать такие модули, как, например, для добавления добавок позже в потоке программы , Самый короткий ответ - это то, чего хочет клиент. – parramorej

ответ

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» в разных подпрограммах). Регистратор stdout инициализируется в одной подпрограмме, а в другом - в журнале. – parramorej

+0

О смене, что ссылка хранится где-то, что я не отслеживал, я попробую ... спасибо. – parramorej

+1

Это будет работать - спасибо. Чтение этого более тщательно в документах также помогло бы мне: «Инициализировать один раз и только один раз - Важно понимать, что Log :: Log4perl инициализируется один раз и только один раз, как правило, в начале программы или системы.() более одного раза приведет к тому, что он закроет существующую конфигурацию и заменит ее новой ». – parramorej

Смежные вопросы