Perlのログ出力について一言

    • Perlにはログ出力のモジュールが(標準機能として)無い。
    • Log4PerlとかLog::DispatchとかLog::Minimalとかいろいろあるらしいけれどログローテートまで備えた簡単に使えるものがないので以下のようなものを埋めこんで毎回使っている。
    • ログサイズととログファイル名だけ変えてやればそれなりに汎用に使える。
    • ローテートの部分がベタ書きだが、forなんかで変数割り当てて回すよりよっぽど明解だと思う。
#!/usr/bin/perl
use strict;
use warnings;
use utf8;

binmode(STDOUT, ":encoding(UTF-8)"); # perlcritic で utf8 よりこっちの方が良いとのこと
binmode(STDIN,  ":encoding(UTF-8)");

# メイン
logger("test");


sub logger
{
        my $LOG_FILE = sprintf("lsearch.log");
        my $LOG_SIZE = 3 * 1024 * 1024;
        my $time = localtime(time());
        if (open my $fh, ">>:encoding(utf8)", $LOG_FILE) {
                print $fh "$time @_\n";
                close $fh;
        }
        else {
                warn "@_";
        }

        my $size = -s $LOG_FILE;
        if ($size > $LOG_SIZE) {
                rename "$LOG_FILE.2", "$LOG_FILE.3" if -f "$LOG_FILE.2";
                rename "$LOG_FILE.1", "$LOG_FILE.2" if -f "$LOG_FILE.1";
                rename $LOG_FILE,     "$LOG_FILE.1";
        }
        return "@_\n";
}