ロギングを行う必要がある Ruby ライブラリに取り組んでいます。理想的には、複数のワーカー プロセスが同じファイルにログインできるようにしたいと考えています。Ruby の標準ライブラリのクラスのソースを見ると、複数のスレッドからログへの書き込みを同期するための努力がなされていることがわかります ( Is Ruby's stdlib Logger class thread-safe?Logger
への回答で指摘されているように)。
複数のプロセスが同じログ ファイルに書き込みを行っている場合にも同様の問題があるようです。基盤となるレイヤーが書き込みをバッファリング/分割する方法によっては、各ログ メッセージの整合性が維持されない場合があります。
では、標準Logger
クラスを使用して、複数のプロセスが単一のファイルに安全にログを記録できるようにする方法はありますか? そうでない場合、これは通常、Ruby プロジェクトでどのように達成されますか?
「安全に」とは次のことを意味します。
- 各ログ行は「アトミック」であり、次のメッセージが始まる前に途切れることなく全体が表示されます。たとえば、何も好きではありません
[1/1/2013 00:00:00] (PID N) LOGMESS[1/1/2013 00:00:01] (PID M) LOGMESSAGE2\nAGE1
- ログに表示されるタイムスタンプが正しい限り、ログメッセージはプロセス間で厳密に順序付けされる必要はありません。
更新:
Tin Man のアドバイスを受けてテストを作成することにしました 。
短いバージョン: Winfield は正しいです。少なくともデフォルトの使用法でLogger
は、複数のプロセスから同時に安全に使用できます (上記の「安全」の定義について)。
重要な要素は、(既に開いている IO オブジェクトではなく) ファイル パスが指定された場合、Logger が modeWRONLY|APPEND
でファイルを開き、それに設定sync=true
することです。これら 2 つのことの組み合わせ (少なくとも Mac OS X での私のテストでは) により、複数のプロセスから同時にログを記録することが安全になるようです。すでに開いている IO オブジェクトを渡したい場合は、必ず同じ方法で作成してください。