ログ出力関数を書いてみた
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); }