RubyのLoggerはスレッドセーフ(&プロセスセーフ)かどうか調べてみたの記事の続編です。
結論から言うと、RubyのLoggerはプロセスセーフになります!
対象のプルリクはこちらで Inter-process locking for log rotation by sonots · Pull Request #428 · ruby/ruby 、無事にマージされて ruby 2.1.0 として 2013/12/25 にリリースされます!
これで Fluentd v11 とか Unicorn とかといったマルチプロセスなアプリでも Ruby Logger のログローテーションを安全に使えますね。Ruby 2.1.0 のリリースを待てない方は gem も作っておいたので、必要であればそちらを使ってください!→ https://github.com/sonots/process_safe_logger
裏話元々は Fluentd (正確には ServerEngine) の Issue として @frsyuki 氏と議論、対応していたものです。それを、
この DaemonLogger、gem で欲しいかもしれない。unicorn.conf とかでも使いたい :D
— そのっつ (SEO Naotoshi) (@sonots) October 21, 2013
うむ!そしてそれを@sonot さんがやる、と!RT @sonots: それだ! RT @frsyuki: と言うかRuby標準の::LoggerクラスがServerEngine::DaemonLogger::MultiprocessFileLogDeviceを使えばいいんでは
— FURUHASHI Sadayuki (@frsyuki) October 21, 2013
@frsyuki @sonot 続きをこの辺 https://t.co/4MLJNRZZjs や bugs にぶち込んで頂けると〜
— SHIBATA Hiroshi (@hsbt) October 21, 2013
@hsbt @frsyuki @sonots 2.1につっこみたかったらわりと至急でよろ
— 成瀬 (@nalsh) October 21, 2013
という流れで、Ruby にプルリクを送ったものになります。該当 pull request では、@nalsh 氏にレビューおよびアドバイスをしていただきました。ありがとうございました。
あとは最後に、今来ている RubyConf 2013 at Miami で今回のネタを元に LT してきた資料をおいておきますね。ということでマルチプロセス環境でも使えるようになりましたのでご活用ください!それでは @sonots でした!