使用log4perl限制日志大小

时间:2012-07-25 11:21:28

标签: perl log4perl

我想限制使用log4perl创建的日志文件的大小。我不希望我的日志文件增长到大约100mb;我只需要最后100mb(或左右)的数据。理想情况下,它会截断早期数据并仅保留最后一位。我知道Log :: Dispatch :: FileRotate模块,但这并不完全符合我的要求,因为我不想要多个日志文件。

这可能吗?

完整代码,包括内联配置,下面(减去使用声明):

my $log_conf = q/ 
    log4perl.category = DEBUG, Logfile
    log4perl.appender.Logfile = Log::Dispatch::FileRotate
    log4perl.appender.Logfile.filename = sub { return get_log_fn(); }
    log4perl.appender.Logfile.mode = truncate
    log4perl.appender.Logfile.autoflush = 1 
    log4perl.appender.Logfile.size =  104857600
    log4perl.appender.Logfile.layout    = Log::Log4perl::Layout::PatternLayout     
    log4perl.appender.Logfile.layout.ConversionPattern = %d %P %M(%L) %p %m %n
/;

Log::Log4perl::init( \$log_conf );
my $logger = Log::Log4perl::get_logger();

INFO "Starting $0";
my $upper = 100000000;
for(my $i=0;$i < $upper;$i++) {
    DEBUG $i;
}

sub get_log_fn 
{
    use File::Basename;
    return sprintf "%s.log", basename( $0, '.pl' );     
}

2 个答案:

答案 0 :(得分:3)

我只是读了一下并做了一个实验。看起来如果你不使用max属性,保留size属性,并使用truncate属性而不是在使用Log::Dispatch::FileRotate时附加,你可以得到你想要的东西:

#!/usr/bin/env perl

use Modern::Perl;
use Log::Log4perl;

Log::Log4perl::init('./log4perl.conf');

my $logger = Log::Log4perl->get_logger('LOG1');

for my $num ( 1..1000 ) {
    $logger->debug($num);
}

$logger->debug('blah');

使用关联的配置文件:

###############################################################################
#                              Log::Log4perl Conf                             #
###############################################################################
log4perl.rootLogger              = DEBUG, LOG1
log4perl.appender.LOG1           = Log::Dispatch::FileRotate
log4perl.appender.LOG1.filename  = ./mylog.log
log4perl.appender.LOG1.mode      = truncate
log4perl.appender.LOG1.autoflush = 1
log4perl.appender.LOG1.size      = 1024
#log4perl.appender.LOG1.max       = 5
log4perl.appender.LOG1.layout    = Log::Log4perl::Layout::PatternLayout
log4perl.appender.LOG1.layout.ConversionPattern = %d %p %m %n

这给我留下了一个130字节的mylog.log,里面有4行:

2012/07/25 08:23:14 DEBUG 998
2012/07/25 08:23:14 DEBUG 999
2012/07/25 08:23:14 DEBUG 1000
2012/07/25 08:23:14 DEBUG blah

<强>更新

即使max设置为0,FileRotate看起来也总是会创建一个.1文件。

如果您无法使用,则需要write your own apender

答案 1 :(得分:0)

我遇到了同样的问题并找到了这个模块:

http://search.cpan.org/dist/Log-Log4perl-Appender-File-FixedSize/lib/Log/Log4perl/Appender/File/FixedSize.pm

也许已经晚了两年,但我认为其他人来到这里可能会受益于此