Как log4perl может одновременно записывать в STDERR и файл? - PullRequest
3 голосов
/ 09 сентября 2011

Я попытался настроить два приложения, но, похоже, пишет только в STDERR:

my $header = "######$scriptname $version";
use Log::Log4perl qw(:easy);
Log::Log4perl->easy_init($DEBUG);
my $logger = get_logger();
my $layout = Log::Log4perl::Layout::PatternLayout->new(
"%d %p> %F{1}:%L %M - %m%n");
my $appender = Log::Log4perl::Appender->new(
        "Log::Dispatch::File",
        filename=>$scriptname.".log",
        mode => "append"
);
$appender->layout($layout);
my $stderr = Log::Log4perl::Appender::Screen->new(
        stderr =>0,
        );

$stderr->layout($layout);
$logger->info($header);

Ответы [ 2 ]

5 голосов
/ 09 сентября 2011

Не очень хорошая идея смешивать easy_init с пользовательскими приложениями.Вы можете исправить это, добавив appender в logger $logger->add_appender($appender).Но это приведет к дублированию сообщений, потому что вы уже установили appender в easy_init.

Я предлагаю вам вместо этого использовать конфигурацию.Вы можете встроить конфигурацию в свой код:

use strict; use warnings;

use Log::Log4perl;

Log::Log4perl->init(\<<CONFIG);
log4perl.rootLogger = DEBUG, screen, file

log4perl.appender.screen = Log::Log4perl::Appender::Screen
log4perl.appender.screen.stderr = 0
log4perl.appender.screen.layout = PatternLayout
log4perl.appender.screen.layout.ConversionPattern = %d %p> %F{1}:%L %M - %m%n

log4perl.appender.file = Log::Log4perl::Appender::File
log4perl.appender.file.filename = 1.log
log4perl.appender.file.mode = append
log4perl.appender.file.layout = PatternLayout
log4perl.appender.file.layout.ConversionPattern = %d %p> %F{1}:%L %M - %m%n
CONFIG

my $logger = Log::Log4perl->get_logger();
$logger->info("my message");
4 голосов
/ 15 июля 2017

В документации Log :: Log4Perl есть ответ на полпути через раздел «Stealth Logger»: http://search.cpan.org/~mschilli/Log-Log4perl-1.49/lib/Log/Log4perl.pm#Stealth_loggers

use Log::Log4perl qw(:easy);

Log::Log4perl->easy_init( { level    => $DEBUG,
                            file     => ">>test.log",
                            layout   => '%F{1}-%L-%M: %m%n' },
                          { level    => $DEBUG,
                            file     => "STDOUT",
                            layout   => '%m%n' },
                        );

У меня был тот же вопрос ... даже через 5 лет после того, как это было опубликовано, оно все еще находится на первой странице Google при поиске "perl log4perl write to file and screen"

...