1

ログファイルに日付が追加されてログファイルが自動的にローテーションされるように log4j を構成する方法を知っています。

log4j.appender.schedulerService.Directory = ${logdir}
log4j.appender.schedulerService.Prefix = web.log_
log4j.appender.schedulerService.Suffix = 

log4perlで同じことを達成するにはどうすればよいですか?

log4Perl で同じ設定を試しましたが、ファイル名パラメータは必須のようです。どんな助けでも大歓迎です。

Mandatory parameter 'filename' missing in call to Log::Dispatch::File::_make_handle
4

2 に答える 2

1

Log::Dispatch::File::Stampedを見てください- 日付がスタンプされたログファイルに直接書き込むため、実際にローテーションする必要がありません (日付が変更されたことを検出すると、新しいログファイルが開始されます)。

log4perl.appender.Logfile=Log::Dispatch::File::Stamped
log4perl.appender.Logfile.min_level=info
log4perl.appender.Logfile.filename=foo.log
log4perl.appender.Logfile.stamp_fmt=%Y%m%d
于 2013-02-19T06:13:45.437 に答える
0

これはよくある質問です:ログファイルを真夜中に自動的にロールオーバーするにはどうすればよいですか?


Log::Dispatch::FileRotateをサブクラス化して、カスタム ファイル拡張子を追加します。

package Log::Dispatch::FileRotate::FileExtension;
use parent 'Log::Dispatch::FileRotate';
use strictures;
use SUPER qw();
use Time::Piece qw();

sub new {
    my ($self, %p) = @_;
    $self = $self->SUPER(%p);
    $self->{extension} = $p{extension};
    return $self;
}

sub log_message {
    ### lines 177..235 from parent class go here
        warn localtime() . " $$ Rotating\n" if $self->{debug};
        my $stamp = Time::Piece->localtime->strftime($self->{extension});
        warn "$$ rename $name $stamp\n" if $self->{debug};
        rename $name, sprintf('%s.%s', $name, $stamp);
        warn localtime() . " $$ Rotating Done\n" if $self->{debug};
    ### lines 257..266 from parent class go here
}

1;

使用法:

use Log::Dispatch::FileRotate::FileExtension qw();
my $file = Log::Dispatch::FileRotate::FileExtension->new(
    name => 'file1',
    min_level => 'info',
    filename  => 'Somefile.log',
    DatePattern => 'yyyy-MM-dd',
    extension => '%F',
);
于 2012-07-09T20:12:54.670 に答える