先日uWSGIのログをfluentdで取り始めたと書きましたが、寝て起きてみると早速問題が発生していて、zabbixにデータが送られてなくてグラフが空の状態になっていました。何で、と思ってみて見るとuWSGIのログが空になっていました。どうもログローテートが走った後にuWSGIがログを開き直しておらず、新しいファイルが空のままになっていたようです。これは酷い。
それでどうするんだっけと、/etc/logrotate.d/の他のファイルをチラチラ見てると、HUP送ったり再起動したりするのが定石っぽいので、uWSGIでもそうするのかなと思ってuwsgi –helpを読んでいると、
--touch-logreopen
というオプションを見つけました。このオプションにファイルを指定すると、そのファイルを監視して変更されたタイミングでログを開き直すというものです。再起動するよりコチラの方が良さそうなので、uwsgi起動スクリプトを少し修正しました。面倒なので変数の内容は割愛します。最後に先ほどのオプションを付け加えただけですね。
$ daemon --pidfile $PIDFILE $PROG --pidfile $PIDFILE --uid $UWSGI_USER -s $UWSGI_ADDRESS --pp $UWSGI_APP_ROOT --module wsgi -d $UWSGI_LOG --logfile-chown $UWSGI_USER --touch-logreopen $UWSGI_LOG.trigger
そしてlogrotateの設定ファイル中にpostrotateで、–touch-logreopenで指定したファイルを更新するようにします。
/path/to/uwsgi.log { daily rotate 7 missingok notifempty compress sharedscripts size 1M postrotate touch /path/to/uwsgi.log.trigger endscript }
以上でuWSGIのログがログローテートで途切れなくなりました。fluentdを使い始めたお陰で早速問題を修正出来て良かったです。
あと適当にググった感じだとfluentdのin_tailは、ログローテートにも対応してるとの事ですが、まだ動作は確認してません。明日のログローテートを待って、まだ問題があれば追記したいと思います。
2013.01.27 追記
in_tailばっちり動いていました。