feumw
feumw

Reputation: 177

log4perl one logger with two appenders and different loglevels

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

Upvotes: 2

Views: 270

Answers (2)

Andi
Andi

Reputation: 1

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

Upvotes: 0

feumw
feumw

Reputation: 177

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;                        \
}

Upvotes: 3

Related Questions