log4j を使用して 1 つのログ ファイルに書き込む複数のスレッドがあり、別のスレッドでそれを読み戻したい場合、常に完全な行を読み取るように、それらのログを (1 行ずつ) 安全に読み取る方法はありますか?
編集:これの理由は、すべてのログを中央の場所にアップロードする必要があるためです。それは、数日前のログまたは書き込まれたばかりのログである可能性があります
log4j を使用して 1 つのログ ファイルに書き込む複数のスレッドがあり、別のスレッドでそれを読み戻したい場合、常に完全な行を読み取るように、それらのログを (1 行ずつ) 安全に読み取る方法はありますか?
編集:これの理由は、すべてのログを中央の場所にアップロードする必要があるためです。それは、数日前のログまたは書き込まれたばかりのログである可能性があります
自分がしていることを実装する必要がある場合、特にファイルのローリングに対処する必要がある場合は、苦痛になります。
特定の要件については、より適切な選択肢があります。
バックアップする場所を直接書き込むことができる場合(つまり、ファイルシステムにマウントできる場合)、そのバックアップディレクトリに書き込むようにファイルローリングを設定することをお勧めします。また
Splunkなどのログ管理ツールを使用してログファイルを監視および管理します(そのバックアップディレクトリにコピーする必要さえありません)。また
すべて自分でバックアップを行う必要がある場合でも、別のスレッドでバックアップを行う必要はありません(理由はありません)。ログディレクトリを監視するシェルスクリプトを作成し、rsyncなどのツールを使用するか、同様のロジックを自分で作成して、ローカルとリモートの場所で一致しないファイルに対してのみアップロードを実行しようとしています。
読み取り/書き込みロックを使用する必要があります。
ファイルへの書き込みが1人でない場合、複数のユーザーが読み取りロックを保持できますが、書き込みロックは、何があっても一度に1つのスレッドでしか保持できません。
書き込みスレッドが書き込みを完了すると、読み取りスレッドが読み取れるようにreadwritelockが解放されることを確認してください。同様に、リーダーが読み取りを完了したら、log4jが書き込みを続行できるように、常に読み取りロックを解除します。
チェックアウト
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/ReadWriteLock.html
しかし、考えてみると、これの目的は何ですか?単にログを監視したい場合は、同じアプリケーション内に監視スレッドを配置するのではなく、別のソリューションを使用する必要があります。意味をなさないようです。データがアプリケーション/サービス内で利用できる場合、なぜそれをファイルに渡してすぐに読み戻すのですか?