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の略のはずだが。