soukouki’s diary

誰かの役に立つ記事をかけたらいいなあ

Rubyに標準でついてくるLoggerは、Windows上かつマルチプロセスのとき、ログローテーションがうまくできないお話

ハマったので久しぶりに記事を書きました。

使用しているLoggerはlibrary logger (Ruby 2.7.0 リファレンスマニュアル)です。

ある日プログラムを書いていると、

log writing failed. closed stream
log shifting failed. closed stream
...
..
.

という警告がたくさん流れてきました。

原因を探ってみると、どうやらLoggerに設定したファイルの大きさが、設定した大きさよりも大きくなったときにこの警告が出ているようです。

色々探してみると、マルチプロセスの際にログローテーションがうまく動かないことがあったようです。 RubyのLoggerはスレッドセーフ(&プロセスセーフ)かどうか調べてみた - sonots:blog

そして、このブログの筆者がマルチプロセスでもログローテーションがうまく動くように直してくれてます! Inter-process locking for log rotation by sonots · Pull Request #428 · ruby/ruby · GitHub

・・・あれ?ならなんでこのメッセージが出るんだろう?

githubにあるソースを覗いてみると、Windowsで動かしているときにコードを変えている部分があります。それを追ってみました。

どうやら、そのっつさんが書いてくれたコードはWindowsでは動作しなかったようです・・・残念。 logger.rb: fix r43511 for Windows · ruby/logger@226add9 · GitHub