I want to log some results into a file withot messing with the leves of my logs. Is it possible to do that with Log::Log4perl
. I have tried to follow the documentation, but I only was able to find that it depends on the log level to printo a file? as in here :
og::Log4perl->easy_init( { level => $DEBUG,
file => ">>test.log",
layout => '%F{1}-%L-%M: %m%n' },
{ level => $DEBUG,
file => "STDOUT",
layout => '%m%n' },
);
But I want to keep logging my stuff in screen and only put another messages into the log file. But I have not been able to find a way to put the result to the log:
use strict;
use warnings;
use Log::Log4perl;
use Win32::Console::ANSI;
my $results = "result.txt";
my $conf = q(
log4perl.appender.SCREEN = Log::Log4perl::Appender::ScreenColoredLevels
log4perl.appender.SCREEN.layout = Log::Log4perl::Layout::PatternLayout
log4perl.appender.SCREEN.color.INFO = bright_white
log4perl.appender.SCREEN.color.WARN = bright_yellow
log4perl.appender.SCREEN.color.ERROR = bright_red
log4perl.appender.SCREEN.layout.ConversionPattern = [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5p] %m %50C::%L %n
);
my $log_level = "TRACE";
my $log_level_conf = "log4perl.category.".__FILE__." = ".$log_level.", SCREEN\n";
$conf = $log_level_conf.$conf;
Log::Log4perl::init( \$conf );
my $log = Log::Log4perl::get_logger(__FILE__);
$log->info("INFO");
$log->debug("DEBUG");
$log->error("error");
$log->fatal("FATAL");
$log->trace("TRACE");
print "\n\n";
$log->info("Im doing foo");
$log->debug( "doing foo");
$log->trace( "crap from foo");
$log->info( "Im doing bar");
$log->debug( "Im doing foo");
$log->trace( "crap from bar");
# $log->result "Foo and bar done";
The line where it says result is the one that I´m looking for, some way to have a diferent function to write into the log using the same $log
.
Is this possible?
Edit: Following the suggestion by @amit bhosale I'm still not able to make it work:
use strict;
use warnings;
use Log::Log4perl;
use Win32::Console::ANSI;
my $conf = q(
log4perl.category = TRACE, AppResult
log4perl.appender.SCREEN = Log::Log4perl::Appender::ScreenColoredLevels
log4perl.appender.SCREEN.layout = Log::Log4perl::Layout::PatternLayout
log4perl.appender.SCREEN.color.INFO = bright_white
log4perl.appender.SCREEN.color.WARN = bright_yellow
log4perl.appender.SCREEN.color.ERROR = bright_red
log4perl.appender.SCREEN.layout.ConversionPattern = [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5p] %m %50C::%L %n
# Custom RESULT logs
log4perl.filter.ResultsFilter = Log::Log4perl::Filter::LevelMatch
log4perl.filter.ResultsFilter.LevelToMatch = RESULT
log4perl.filter.ResultsFilter.AcceptOnMatch = true
log4perl.appender.AppResult = Log::Log4perl::Appender::File
log4perl.appender.AppResult.filename = results.log
log4perl.appender.AppResult.mode=append
log4perl.appender.AppResult.Filter = ResultsFilter
log4perl.appender.AppResult.layout = Log::Log4perl::Layout::PatternLayout
log4perl.appender.AppResult.layout.ConversionPattern = [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5p] %m %50C::%L %n
);
my $log_level = "TRACE";
my $log_level_conf = "log4perl.category.".__FILE__." = ".$log_level.", SCREEN\n";
$conf = $log_level_conf.$conf;
Log::Log4perl::Logger::create_custom_level("RESULT", "WARN");
Log::Log4perl::init( \$conf );
my $log = Log::Log4perl::get_logger(__FILE__);
$log->info("INFO");
$log->debug("DEBUG");
$log->error("ERROR");
$log->warn("WARN");
$log->fatal("FATAL");
$log->trace("TRACE");
print "\n\n";
$log->info("Im doing foo");
$log->debug( "doing foo");
$log->trace( "crap from foo");
$log->info( "Im doing bar");
$log->debug( "Im doing foo");
$log->trace( "crap from bar");
$log->log('RESULT', "Foo and bar done");
I´m getting a priority RESULT isn't numeric at test_logs.pl line 60.
exception