uWSGIのログローテートが出来てなかった話

先日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ばっちり動いていました。

Leave a Reply

Your email address will not be published. Required fields are marked *