I'm writing a Log4perl logger and am using the localtime() function. The problem is, every time I call the module that reinstantiates the log4perl logger (for a different file) the localtime() will be different, making several different log files when I want them all in one file.
Thoughts?
use strict;
use warnings;
use Config::IniFiles;
use File::Copy;
use Cwd 'abs_path';
use Path::Class;
The above is the code before I do use LIB::Paths
and is the first file that uses Paths.pm. The code below is the Paths.pm file. The first file calls use LIB::Paths
and so does the second file [which can be added but I didn't want to just throw all the code at you guys]. This makes two separate timestamps.
my @now = localtime();
### May want to add something from the input name to the log file
our $timeStamp = sprintf("%04d_%02d%02d_%02d%02d%02d",
$now[5]+1900, $now[4]+1, $now[3],
$now[2], $now[1], $now[0]);
my $logFile = "$timeStamp.log";
our $fullLogPath = $output_dir . "/" . $log_dir . "/" . $logFile;
qx(touch $fullLogPath);
# write path and level to log configuration file
our $logLevel = $parms->val('MAIN','LogLevel');
open FILEHANDLE, '>', "$base_dir/CONFIG/log.conf";
print FILEHANDLE "log4perl.rootLogger=$logLevel, LOGFILE\n";
print FILEHANDLE "log4perl.appender.LOGFILE=Log::Log4perl::Appender::File\n";
print FILEHANDLE "log4perl.appender.LOGFILE.filename=$fullLogPath\n";
print FILEHANDLE "log4perl.appender.LOGFILE.mode=append\n";
print FILEHANDLE "log4perl.appender.LOGFILE.layout=PatternLayout\n";
print FILEHANDLE "log4perl.appender.LOGFILE.layout.ConversionPattern=%F{1} %8L %10p %n %m%n";
close (FILEHANDLE);
open SECONDFILE, '>', "$base_dir/CONFIG/log2.conf";
print SECONDFILE "log4perl.rootLogger=$logLevel, LOGFILE\n";
print SECONDFILE "log4perl.appender.LOGFILE=Log::Log4perl::Appender::File\n";
print SECONDFILE "log4perl.appender.LOGFILE.filename=$fullLogPath\n";
print SECONDFILE "log4perl.appender.LOGFILE.mode=append\n";
print SECONDFILE "log4perl.appender.LOGFILE.layout=PatternLayout\n";
print SECONDFILE "log4perl.appender.LOGFILE.layout.ConversionPattern=%F{1} %n %m%n";
close (SECONDFILE);
First, you dont have to use file to store log4perl config, you could use strings to initialize the logger.
Second, you could use filerotate appender to create a new logfile every day, keep the last n files.
In your example every call will creates a new file. If you use only day 'specific' patter it will create a new file every day:
our $timeStamp = sprintf("%04d_%02d%02d", $now[5]+1900, $now[4]+1, $now[3]);
);
Regards,
filerotate:
my $fullLogPath = $output_dir . "/" . $log_dir . "/" . "testlogger.log";
# Logger config
my $log_conf = q(
log4perl.category = INFO, FileAppndr
log4perl.appender.FileAppndr = Log::Dispatch::FileRotate
log4perl.appender.FileAppndr.filename = $fullLogPath
log4perl.appender.FileAppndr.mode = append
log4perl.appender.FileAppndr.DatePattern = yyyy-MM-dd
log4perl.appender.FileAppndr.max = 10
log4perl.appender.FileAppndr.TZ = GMT
log4perl.appender.FileAppndr.layout = PatternLayout
log4perl.appender.FileApp.layout.ConversionPattern = %F{1} %n %m%n
);
# Initialize Logger
Log::Log4perl::init_once(\$log_conf);