ruby1.9.3 と sinatra、unicornの構成でWebシステム運用中です。
unicornのworker_process は5 に設定。
そんな設定下で、下記のようなコードがありました。
logger = Logger('hoge.log', daily)
logger.info "hogehoge"
期待する動きとしては、/log/hoge.log が出来て、
日付が変わるときに /log/hoge.log.YYYYMMDD になってローテートしてくれるハズ。
しかし、現実は非情であり。
日付が変わると、
/log/hoge.log.YYYYMMDD
ができると、その後に続くように
/log/hoge.log.YYYYMMDD.1
/log/hoge.log.YYYYMMDD.2
/log/hoge.log.YYYYMMDD.3
/log/hoge.log.YYYYMMDD.4
…というログファイルが生成されます。
どうやら、workerのプロセスごとに個別にローテートをしようとしてくれている。
…ですが。
これだとログファイルの数だけとっ散らかっていき可読性悪いことこの上ないです。
普通に logrotate.d を使うしかないのか、、と思っていましたが、
同様の問題に当たった方が、プロセスセーフを考慮したLoggerを作ってくれていました。
process_safe_logger というgem になります。
また、Ruby2.1.0からは、デフォルトでプロセスセーフになったとのこと。
おお、これは嬉しい!感謝感謝です。
とはいえ、現行システムはgem対応までしかできないですけどね…w
翌日譚
あれー相変わらずログは「hoge.log.YYYYMMDD.1」形式で出力されてるorz
改めて記事の内容を確認していったところ、プロセスセーフという言葉を完全に勘違いしていますね…
お恥ずかしい。。
ログファイルのロックや上書きが発生してしまうことが問題であり、
ログファイルが複数できるのは仕様上正しい動きのようです。
これは、ログを収集するプログラム(fluentdですが)の方で吸収するのがいいかもしれないな…。