简体   繁体   English

Perl日志文件被命名为时间戳问题

[英]Perl logfile named as timestamp issue

I'm writing a Log4perl logger and am using the localtime() function. 我正在编写Log4perl记录器,并且正在使用localtime()函数。 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. 问题是,每当我调用重新实例化log4perl记录器的模块(对于另一个文件)时,localtime()都会不同,当我希望它们全部集中在一个文件中时,它们会生成多个不同的日志文件。
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. 上面是我确实use LIB::Paths之前的代码,并且是使用Paths.pm的第一个文件。 The code below is the Paths.pm file. 下面的代码是Paths.pm文件。 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]. 第一个文件调用use LIB::Paths ,第二个文件也使用[可以添加,但我不想只是把所有代码扔给你们]。 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. 首先,您不必使用文件来存储log4perl配置,您可以使用字符串来初始化记录器。

Second, you could use filerotate appender to create a new logfile every day, keep the last n files. 其次,您可以每天使用filerotate附加程序创建一个新的日志文件,并保留最后n个文件。

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: 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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM