• 締切済み

File::Tailでファイル名変更に追従するには

 あるログファイルをリアルタイムにトレースして流量を測る ツールを作ろうとしています。  mailstats.plを参考にいろいろと試しているのですが、監視 しようとしているログが日付つきのファイル名で作られていて 日次でファイル名が変わってしまうのです。  File::Tailはデフォルトだとdieしてしまいますが、errmode でハンドラを試してみたり、name_changesを試してみたり していますがうまくいきません。  ログをはいているプロセスに、ファイル名が変わるタイミン グで何かをキックしてもらうか、とも考えたのですがあまりス マートではないような気がしています。  良い方法はあるでしょうか。詳しい方教えてください。  よろしくお願いいたします。  以下errmode,name_changes等を試す前のスクリプトです。 === #!/usr/bin/perl use File::Tail ; $debug = 0; $mail_log = './log' ; my $logref=tie(*LOG,"File::Tail",(name=>$mail_log,debug=>$debug)); while (<LOG>) { print; } ; ===  ファイルがmvされると、 Error opening ./log: No such file or directory at ./tail.pl line xx  となります。  このエラーをフックして、再オープンできれば良いのですが。。

みんなの回答

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

ignore_nonexistant は試されましたか ?

参考URL:
http://search.cpan.org/~mgrabnar/File-Tail-0.99.3/Tail.pm
tsmrxx
質問者

お礼

コメント、ありがとうございます。 結果、うまくうごきました。 いろいろ試してよくわからなくなってきていますが。。 なぜか、こう書くと、最初のオープン時にエラーになります。 === $mail_log = './log' ; $logref=tie(*LOG,"File::Tail",(name=>$mail_log,maxinterval=>5,name_changes=>\&change,debug=>$debug)); =↑こうすると =↓こうなる Error opening ./log: No such file or directory at ./tail.pl line 18 === ./logはあるのに、です。 ご教示いただいたとおり、 ignore_nonexistant=>1 を追加したら出なくなりました。 これで先に進めそうですが、、 なんで./logがあるのに、No such file or directoryと言われるのか 気持ち悪い感じです。 Tail.pmを読んでみます。 ありがとうございました。