質問: log4j2ファイルログ出力 javaアプリで、ログファイルを参照・コピーする場合は、 正しくはアプリを停止して参照、コピーするものでしょうか? linuxサーバーなどの/var/log/syslogなどでも稼働中はlessコマンドなどで参照していけなかったのか... ファイル書き込み中はファイルロックがかかり参照・コピーは書き込みが終わってからなので大丈夫なのか... これまで稼働中アプリのログファイルを開いてファイルが壊れることはなかったのですが 仕組みを教えていただきたいです。
回答: 単一のファイルに複数プロセスから追記するのでなければ、「ファイルが壊れる」心配はないと思います。 ``` tail -f ファイル ``` で、いままさに書き足されているファイルの中身を表示させるのは、よくやることです。 書いているプロセスが動作中なのに参照すると、半端なところで出力が止まっているファイルが見えてしまうことがあります。これは、ロックではなくてバッファリングのためです。ファイルを書く側で固定サイズのバッファを使っていて、それがいっぱいになるタイミンクでOSにファイルを出力する場合があります。そのような場合、プログラムはちょこちょこログを出しているのに、ファイルにはたとえば「4KB」たまる度にドサッと出力されます。 それを嫌って、ログ出力プログラムでは、一行出力するたびに、OSに書きにいくこともあります。 「ログファイルのコピー」となると、話はちょっと別で、プログラムを停止させてから(少なくともログ出力が止まっているタイミングで)、コピーした方がよいでしょう。ファイルの末端が半端な状態のコピーができる可能性があります。 プログラムを止めたくない、末端が半端なのは我慢できる、というのであれば、大丈夫です。 きれいな単位で読み取ることを「保証」するために、書き込む側と読み出す側でそれぞれロックを掛けながら処理する、という場合では、ロックを使う方法が考えられなくはないですが、ログファイルではそこまでやらないでしょう。 リンク先の記事のことは、忘れていいと思います。そこでの課題を解決する方法について解の例を説明することはできますが、こちらの質問のニーズを超えますので。