2

I'm trying to log into two different files on different loglevels using a single logger:

perl.pl

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

Expected result:

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

Actual result:

log.log:

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

debug.log:

[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
simbabque
  • 53,749
  • 8
  • 73
  • 136
feumw
  • 151
  • 9
  • That's what I did. The result is not like expected. Like you can see in the example, I'm missing the loglevel ERROR and FATAL in my log. – feumw Aug 30 '18 at 13:44

2 Answers2

3

I found one solution here: https://metacpan.org/pod/Log::Log4perl::Filter#DESCRIPTION Simply create your own filter...

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;                        \
}
feumw
  • 151
  • 9
0

Or even better use LevelRange Filter of Log4perl package:

log4perl.filter.Match4Log               = Log::Log4perl::Filter::LevelRange
log4perl.filter.Match4Log.LevelMin      = INFO
log4perl.filter.Match4Log.LevelMax      = ERROR
log4perl.filter.Match4Log.AcceptOnMatch = true

See example How to set two appenders with different log levels

Andi
  • 1