質問

他のアプリケーションによっても書き込まれているログファイルにlog4jロギングイベントを書き込む方法はありますか。他のアプリケーションは非Javaアプリケーションである可能性があります。欠点は何ですか?ロックの問題?書式設定しますか?

役に立ちましたか?

解決

Log4jにはSocketAppenderがあり、これはイベントをサービスに送信します。これは、自分で実装するか、Log4jにバンドルされている単純な実装を使用できます。

syslogdとWindowsイベントログもサポートします。これは、ログ出力をJava以外のアプリケーションからのイベントと統合しようとする場合に役立ちます。

パフォーマンスがまったく問題になる場合は、さまざまなロギングアプリケーション間で一貫したロック戦略を調整しようとするのではなく、単一のサービスでログファイルを書き込む必要があります。

他のヒント

最善の策は、各アプリケーションを個別にログに記録してから、スケジュールされたジョブを所定の場所に配置して、時間に基づいてファイルを「ジッパー」することです。完全なログへの最新のアクセスが本当に必要な場合は、1時間ごとに実行できます。

次の2つのアプローチの経験があります:

  1. プレーンテキストファイルの代わりにログにデータベースを使用します-パフォーマンスの問題のために法外な場合がありますが、ログの分析、レポートの作成は非常に簡単です。データベースはすべての並行性の問題を処理します。
  2. 他のアプローチでは、JBossサーバーを使用します。これは、他のソースからログ情報を読み取るために使用できます。 JBossは最小限の設定で実行でき、そのおかげで本当に軽量です(起動時間が2秒)。詳細はこちら http://docs.jboss.org/process -guide / en / html / logging.html (別のサーバーへのログ記録)。 Log4Jは、すべてのロック/並行性の問題を処理します。

JBossを使用する予定がない場合は、独自のロギングソリューションのベースとして2番目のアプローチを使用できます。

デフォルトのlog4jアペンダーがファイルのロックや同期を行うとは思わない。このようなロックがないと、ログメッセージを失ったり、破損したメッセージを受信したりする可能性があります。

Javaでファイルロックを行うことがどれほど簡単かはわかりませんが、これを直接機能させるには、適切なAppenderをサブクラス化し、ロギングメソッドをオーバーライドし、ロックする同期コードでラップする必要があると思いますファイルのロックを解除します。これは、システムの負荷によってはパフォーマンスに影響する場合があります。

Log4perlには、同期するAppender、Log :: Log4perl :: Appender :: Synchronizedがあり、これはAppenderをラップしてこれを実現し、Log :: Log4perl :: Appender :: Fileにインターリーブを防止するフラグを提供するようです行。 Javaで複製可能かどうかを確認するために、それらの動作を確認することもできます。

Log4jは十分に柔軟であるため、ファイル内の既存のレコードと互換性のある形式でログエントリを作成できます。特定のデータフィールドをフォーマットする方法については、アペンダーを調べてください。

主な関心事は、おそらく他のアプリケーションによるロックです。すべてのアプリケーションがファイルを排他的にロックしていないことを確認してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top