他のアプリケーションによっても書き込まれているログ ファイルに log4j ロギング イベントを書き込む方法はありますか。他のアプリケーションは、Java 以外のアプリケーションである可能性があります。欠点は何ですか?ロックの問題?整形?
5 に答える
Log4j には、イベントをサービスに送信する SocketAppender があります。これは、自分で実装するか、Log4j にバンドルされている単純な実装を使用できます。
また、syslogd と Windows イベント ログもサポートしています。これは、ログ出力を Java 以外のアプリケーションからのイベントと統合するのに役立つ場合があります。
パフォーマンスがまったく問題になる場合は、さまざまなロギング アプリケーション間で一貫したロック戦略を調整しようとするのではなく、ログ ファイルを書き込む単一のサービスが必要です。
デフォルトの log4j アペンダーがファイルのロックや同期を行うとは思いません。このようなロックがないと、ログ メッセージが失われたり、壊れて受信されたりする可能性があります。
Java でファイル ロックを行うのがどれほど簡単かはわかりませんが、これを直接機能させるには、適切な Appender をサブクラス化し、ログ メソッドをオーバーライドして、ファイルをロックおよびロック解除する同期コードでラップする必要があると思います。 . これは、システムの負荷によっては、パフォーマンスに影響を与える可能性があります。
Log4perl には同期アペンダー、Log::Log4perl::Appender::Synchronized があり、これはアペンダーをラップしてこれを実現します。また、その Log::Log4perl::Appender::File にインターリーブされた行を防止するフラグを提供するようです。Javaで複製できるかどうかを確認するために、それらが何をするかを見るかもしれません。
私は次の2つのアプローチの経験があります。
- プレーン テキスト ファイルの代わりにデータベースを使用してログを記録します。パフォーマンスの問題が原因で禁止される場合がありますが、ログを分析してレポートを作成するのは非常に簡単です。データベースは、すべての並行性の問題を処理します。
- もう 1 つのアプローチは、他のソースからログ情報を読み取るために使用できる JBoss サーバーの使用を伴います。JBoss は最小限の構成で実行できるため、非常に軽量です (起動時間は 2 秒)。詳細はhttp://docs.jboss.org/process-guide/en/html/logging.html (別のサーバーへのロギング) にあります。Log4J は、すべてのロック/同時実行の問題を処理します。
JBoss を使用する予定がない場合は、独自のロギング ソリューションのベースとして 2 番目のアプローチを使用できます。
あなたの最善の策は、各アプリケーションに個別にログを記録させ、スケジュールされたジョブを配置して、時間に基づいてファイルをまとめることです。完全なログへの最新のアクセスが本当に必要な場合は、これを 1 時間ごとに実行できます。
Log4j は柔軟性に優れているため、ファイル内の既存のレコードと互換性のある形式でログ エントリを作成できます。特定のデータフィールドをフォーマットする方法については、アペンダーを調べてください。
あなたの主な関心事は、おそらく他のアプリケーションによるロックです。すべてのアプリケーションがファイルを排他的にロックしていないことを確認してください。問題はありません。