ログ出力関数を書いてみた

2012/02/17更新→Perlのログ出力について一言 - ymkoの日記

基本的なことながらデバッグを標準出力やらエラー出力に
出しているとついさっきの出力ってどんなのだったかなと
なるので簡単なログ出力関数を書いてみた。
log4perlメンドクサイ。
ログローテート対応。
 
log_out("test"); てな感じで使える。

use strict;
use warnings;
use File::Basename;
use File::Path;
use Fcntl;

sub log_out
{
    my ($msg) = @_;
    
    # --- setting ---
    my $logfile = "/tmp/log/hato/hato.log";
    my $rotate  = 9;
    my $logsize = 512 * 1024;
    # ---------------

    my $dirname = dirname $logfile;
    eval { mkpath($dirname, 0, 0755) } unless -d $dirname;
    
    sysopen my $fh, $logfile, O_WRONLY|O_CREAT|O_APPEND or 
                         die "$!:$logfile wasn't written";
    flock($fh, 2);
    my $line = sprintf("%s $msg", now_time());
    print $fh "$line\n";
    close($fh);
    
    if (defined $rotate) {
        my $size = -s $logfile;
    
        if ($size >= $logsize) {
            foreach my $i (1..$rotate) {
                my $after  = $rotate - $i + 1;
                my $before = $rotate - $i;
                my $a_logfile = "$logfile.$after";
                my $b_logfile = ($before) ? "$logfile.$before" : $logfile;
                
                if (-f $b_logfile) {
                    rename($b_logfile, $a_logfile);
                }
            }
        }
    }
    
    return 1;
}

sub now_time
{
    #     0    1    2     3     4    5     6     7     8
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
    my @abbr = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
    #my @day_of_week = qw( Sun Mon Tue Wed Thu Fri Sat );
    # print "$day_of_week[$wday]\n";
    
    #$year += 1900;
    #$mon  += 1;
    
    # messages style
    return sprintf("%s %02d %02d:%02d:%02d", $abbr[$mon], $mday, $hour, $min, $sec);
}