諸事情でlogrotate を使わないでスクリプトで自前でローテートしたいときがたまにあって、でも自力で hoge.log をhoge.log.1(.gz)、hoge.log.1(.gz)をhoge.log.2(.gz) にリネーム、、、なんてことやってたんだけど面倒くさくてやだなーと思っていたら素敵モジュールあった。
使い方はsynopsysのままで十分いけますね。ローテートの前後で何か処理をしたいときはPre,Post にコールバック書いておく。
use Logfile::Rotate; my $log = new Logfile::Rotate( File => '/var/adm/syslog/syslog.log', Count => 7, Gzip => 'lib', Post => sub{ open(IN, "/var/run/syslog.pid"); kill("HUP", chomp(<IN>)); }, Dir => '/var/log/old', Flock => 'yes', Persist => 'yes', ); # process log file $log->rotate();
ただし、これはsynopsysの例の通りにrotateした後syslogdをkill -HUPしているけど、perldoc Logfile::Rotateみたら
rotate() This method will copy the file passed in "new" to a file of the same name, with a numeric extension and truncate the original file to zero length.
と書いてある。copyしてから元のfile sizeを0にtruncateしているのであって、move してるわけじゃないから元のfile のinode変わらないので、kill -HUPしなくていいはず。してもいいけど。