3

log4perlで作成されるログファイルのサイズを制限したい。ログファイルが約100MBを超えないようにします。最後の100MB(またはその前後)のデータのみが必要です。理想的には、以前のデータを切り捨てて、最後のビットのみを保持します。Log :: Dispatch :: FileRotateモジュールを認識していますが、複数のログファイルが必要ないため、要件を完全には満たしていません。

これは可能ですか?

以下のインライン構成を含む完全なコード(useステートメントを除く):

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' );     
}
4

2 に答える 2

3

ちょっと読んで実験してみました。Log::Dispatch::FileRotateを使用しているときに max 属性をオフにし、size 属性を保持し、追加するのではなく truncate 属性を使用すると、必要なものを取得できるようです。

#!/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

これにより、4 行の 130 バイトの mylog.log が残ります。

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 ファイルを作成するようです。

それがどうしてもうまくいかない場合は、独自の apender を作成する必要があります。

于 2012-07-25T13:27:26.703 に答える
0

私は同じ問題を抱えていて、このモジュールを見つけました:

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

おそらく2年遅れだけど、ここに上陸した他の人々がこれから恩恵を受けるかもしれないと私は考えた

于 2014-05-15T21:22:08.263 に答える