質問: このようなとき、ファイルを切り詰める正しい方法は何ですか? 切り詰めた後は、その `/path/to/log` に対しての出力を引き続き行なって欲しいと考えているのですが、これはその出力を行なっているプロセスが、例えば素朴にファイルディスクリプタを開いてそれに対して延々 write しているだけのようなプログラムであったとしても、問題なく行えますか?それともログ出力中のプロセスは、何かの例外からの復帰処理に対応している必要がありますか?
回答: linuxではlogrotateコマンドを用いてログを切替を実施したり、世代管理を実施する方法があります。logrotateコマンドはログを出力しているプロセスの外側からログを管理(リネーム、コピーなどなど)していきますが、もちろん銀の弾丸ではありません。一度開いたファイルポインタをそのまま持ちまわるようなプログラムだと、切替以降の書き込みで失敗することも想定されます。たとえばjavaのlog4jでは(おそらく特定の設定条件で)外部からファイル名の変更、削除、再作成などを経た場合に、ファイルに正しく書き込みできなくなっている事象を経験しました。つまり、logroteteは便利だけど、正しく運用するためには、ログを吐き出す側での正しい設計と実装が不可欠となるということです。 もともとログに何を期待しているの?という話もありますが、例えば法廷要件を満たすためにログを使用したいと考えている場合などは「ファイル」ではなくDBへの書き込み(失敗した場合のみエラーログを出力。エラーログの切替運用は行わない。)などの配慮が必要で、それは割とシステム要件によったりします。 こうして考えると「ログファイル」は管理が面倒なので、最近のクラウドを前提とするような世界では、標準(エラー)出力に投げておくことを選択し、あとの管理はプラットフォーム側のロツールにゆだねることが多いようです(主観ですいません)。たとえば、AWSであれば、その後のことはcloud watchにお願いしちゃうような使い方です。