Logfile::Rotate - perl でログをローテート

諸事情で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しなくていいはず。してもいいけど。