log4perl один логгер с двумя приложениями и разными уровнями логирования - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь войти в два разных файла на разных уровнях журнала, используя один регистратор:

перл.пл

use Log::Log4perl;
Log::Log4perl::init('log4perl.conf');
my $logger = Log::Log4perl->get_logger('test');
$logger->trace('trace');
$logger->debug('debug');
$logger->info('info');
$logger->warn('warn');
$logger->error('error');
$logger->fatal('fatal');

log4perl.conf

log4perl.logger.test = ALL, log, debug

log4perl.appender.debug = Log::Log4perl::Appender::File
log4perl.appender.debug.filename = debug.log
log4perl.appender.debug.layout = Log::Log4perl::Layout::PatternLayout
log4perl.appender.debug.layout.ConversionPattern = [%d] %p %m %n

log4perl.appender.log = Log::Log4perl::Appender::File
log4perl.appender.log.filename = log.log
log4perl.appender.log.layout = Log::Log4perl::Layout::PatternLayout
log4perl.appender.log.layout.ConversionPattern = [%d] %p %m %n
log4perl.appender.log.Filter = MatchWARN

# Filter to match level WARN
log4perl.filter.MatchWARN  = Log::Log4perl::Filter::LevelMatch
log4perl.filter.MatchWARN.LevelToMatch  = WARN
log4perl.filter.MatchWARN.AcceptOnMatch = true

Ожидаемый результат:

log.log:

[2018/08/30 15:06:22] WARN warn 
[2018/08/30 15:06:22] ERROR error 
[2018/08/30 15:06:22] FATAL fatal

debug.log:

[2018/08/30 15:06:22] TRACE trace 
[2018/08/30 15:06:22] INFO info 
[2018/08/30 15:06:22] DEBUG debug
[2018/08/30 15:06:22] WARN warn 
[2018/08/30 15:06:22] ERROR error 
[2018/08/30 15:06:22] FATAL fatal

Фактический результат:

log.log:

[2018/08/30 15:06:22] WARN warn 

1036 ** debug.log * * 1038

[2018/08/30 15:06:22] WARN trace 
[2018/08/30 15:06:22] INFO info 
[2018/08/30 15:06:22] DEBUG debug
[2018/08/30 15:06:22] WARN warn 
[2018/08/30 15:06:22] ERROR error 
[2018/08/30 15:06:22] FATAL fatal

1 Ответ

0 голосов
/ 30 августа 2018

Я нашел одно решение здесь: https://metacpan.org/pod/Log::Log4perl::Filter#DESCRIPTION Просто создайте свой собственный фильтр ...

log4perl.filter.FilterWARN = sub {      \
     my %p = @_;                      \
     if($p{log4p_level} eq "WARN" or  \
        $p{log4p_level} eq "ERROR" or \
        $p{log4p_level} eq "FATAL") { \
         return 1;                    \
     }                                \
     return 0;                        \
}
...