2013/01/19

Log::Minimal のログファイルを log level とか PID ごとに出し分ける

下の方に【追記】があるので参照必須。

Log::MinimalFile::Stamped を使うと、日付ごととか時間ごとにファイル名を分けて書き出すことが可能です。

で、タイトルの通り、log level とか PID ごとに出し分けたいなーと思いまして、File::Stamped::Extended 書きました。恐らく要求として多くないと思うのと、わずかながら速度が犠牲になるかと思い、別ディストリに。

以下のようにして、ログファイルパターンに $! が利用できます。

use Log::Minimal;
use File::Stamped::Extended;

my $fh = File::Stamped::Extended->new(pattern => '/var/log/myapp.log.!!.$$.%Y%m%d');
local $Log::Minimal::PRINT = sub {
    my ( $time, $type, $message, $trace) = @_;
    $fh->extra($type);
    print {$fh} "$time [$type] $message at $trace\n";
};

$ は PID に置き換わります。! は extra パラメータにセットされた文字列に置き換わります。上の例ではログレベルを入れていますが、必要があれば他の用途として使うこともできます。
ちなみに、$$$$$ のように書くと、PID が 123 の場合、00123 という風に桁をそろえて出力してくれたりします。この辺は Log::Dispatch::File::Alert インスパイア。

fluent の時代に、周回遅れ感ありありですが、どうぞよろしく。


【追記】

本家 File::Stamped 0.03 で callback が実装されたので、上記 Extended を使うことなく File::Stamped 単独で log level でも PID でも自由に filename を書き換えられるようになりました。

!! を PID に書き換える例。

use File::Stamped;

my $pattern = '/path/to/myapp.log.!!.%Y%m%d.log';

my $fh = File::Stamped->new(callback => sub {
    my $file_stamped = shift;
    local $_ = $pattern;
    s/!!/$$/ge;
    $_ = POSIX::strftime($_, localtime());
    return $_;
});

File::Stamped::Extended はしばらくしたら消えます。

サイト内検索