logrotateとsyslogd

Webアプリのログを取ることになり、logrotateの利用を考える。

しかし「ローテートするタイミング」と「書き込みのタイミング」が被るとどうなるんだ?なんていうことを考えてしまい、自前で処理するのが面倒になった(笑)ので、広く使われているsyslogなら問題なかろう!たぶん!ってことでsyslog経由でログを出すことにした。

…syslogって標準のものの他にアプリケーションとして追加できるのは7種類ぐらいなのね…*1


気を取り直して設定を続けるが、syslog用のlogrote設定に書かれている

/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true

の意図*2がよく分からない。分からなくてもその設定で同時にローテートすることが出来るのでまぁ大丈夫なのだが、実は他のものとはローテーションが若干違うので設定を分けなければならない。

仕方がないので、自前の設定にはこの部分を入れないままlogrotateを行ってみて意味が分かった。

logroteは実行されるのでファイルはリネームされたり新規作成されたりするのだが、問題の処理を行わない場合、syslogdは古いファイルにログを書き込み続けるのである。

linuxではファイル名とは違う次元でファイルの実態を扱っている*3ので、ファイル名が変わってもsyslogは古い方のファイルをそのまま使い続けてしまうようだ。そこで一度syslogdを再起動?してやる必要があるらしい。


…かわりにlogrotateに「copytruncate」を指示してもいいんだろうか?

syslogの設定がそうなっているのは「その方が実行速度的に有利*4だから」だと思われるので、そうしないのもあれだが。

…と思いながらlogrotateのmanページを確認すると、copytruncateのところに「copyしたあとtruncateするまでに微妙な時間差があるので、ログが跳ぶ可能性があり危険だ」と書かれていた。だったら避けるべきなのか。…しかし、デーモンの再起動中もログはとぶ可能性があるんじゃないのか?

あるいは「HUP」のシグナルを受け取っても、必ずしも「終了」していない可能性があるかもしれない。
シグナルってなに? - ITmedia エンタープライズ
だと、HUP=変更を反映するになっている。
…HUPはhung upの略のはずだが。

*1:正確には8種類だが、一つはブートログに使われていた

*2:見通しを悪くしている部分をのぞくと、kill -HUP (syslogdのpid)を実行しているだけ。

*3:ハードリンクしたりするので実感がある。正式にはiノード番号というらしい。ファイルハンドルを開きっぱなしにしている…ことはたぶんないだろうから、この番号を保持しているんだろう。

*4:リネーム作業の方が明らかに速い。特にファイルが大きい場合。