14

現在、私のアプリケーションでは、特定の時点で、いくつかの重い内容をログ ファイルに記録しています。

基本的にはロギングのみを目的として、使用可能なデータの JSON を作成し、ログ ファイルにログインします。これは、JSON 形式でデータをログに記録するためのビジネス要件です。

現在、利用可能なデータから JSON を作成してから FILE にログを記録するには、多くの時間がかかり、元の要求の戻り時間に影響します。今のアイデアは、場所を改善することです。

これまで説明してきたことの 1 つは、次を使用してスレッド プールを作成することです。

Executors.newSingleThreadExecutor() 

コードにタスクを送信すると、データが JSON に変換され、その後のログが記録されます。

これを行うのは良いアプローチですか?スレッドプール自体を管理しているため、問題が発生する可能性はありますか?

誰かがより良い解決策を共有できれば幸いです。何らかの方法でこれに Log4j を使用します。AsyncAppender を使用しようとしましたが、目的の結果が得られませんでした。EJB 3、Jboss 5.0、Log4j、java6 を使用しています。

4

5 に答える 5

9

ロギングに別のスレッドプールを使用するという点で、あなたは正しい方向に進んでいると思います。多くの製品で、非同期ログ機能が表示されます。ログは、要求スレッドとは別のスレッドを使用して蓄積され、ログ ファイルにプッシュされます。特に、何百万もの受信リクエストがあり、応答時間を数秒未満にする必要がある本番環境では. ログを記録してシステムを遅くするようなことはできません。したがって、使用されるアプローチは、メモリ バッファーにログを追加し、適切なサイズのチャンクで非同期にプッシュすることです。

ロギングにスレッド プールを使用する際の注意 点 複数のスレッドがログ ファイルとメモリ ログ バッファで動作するため、ロギングには注意する必要があります。タイム スタンプでソートされたログ ファイルにログが確実に出力されるようにするには、FIFO 形式のバッファにログを追加する必要があります。また、ファイル アクセスが同期されていることを確認し、ログ ファイルがすべて逆さまになったり、めちゃくちゃになったりする状況に陥らないようにします。

于 2013-06-10T07:07:58.937 に答える
7

Logback、AsyncAppenderを見てください。すでに別のスレッドプール、キューなどを提供しており、簡単に構成できます。実行していることとほとんど同じですが、車輪を再発明する必要がありません。

于 2013-06-10T07:11:02.510 に答える
3

ロギングに MongoDB を使用することは考慮されていますか?

  1. MongoDB の挿入は非同期で実行できます。ロギングが遅い、停止している、またはダウンしている場合に、ユーザーのエクスペリエンスが停止することは望ましくありません。MongoDB は、応答コードを待たずに、ログ コレクションへの挿入を開始する機能を提供します。(応答が必要な場合は、 getLastError() を呼び出します — ここではスキップします。)
  2. 古いログ データは自動的に LRU アウトされます。上限のあるコレクションを使用することで、ログにスペースを事前に割り当て、それがいっぱいになると、ログはラップされ、指定されたスペースを再利用します。過剰なログ情報でディスクがいっぱいになるリスクはなく、ログのアーカイブ/削除スクリプトを記述する必要もありません。
  3. 問題には十分な速さです。まず、MongoDB は一般的に非常に高速であり、このような問題には十分高速です。次に、キャップ付きコレクションを使用すると、挿入順序が自動的に保持されます。タイムスタンプにインデックスを作成する必要はありません。これにより処理がさらに速くなり、ロギングのユースケースでは読み取りに比べて書き込みの数が非常に多いことを考えると重要です (ほとんどのデータベースの問題とは逆です)。
  4. ドキュメント指向/JSON は、ログ情報に最適な形式です。非常に柔軟で、必要なときに追加のフィールドを投入できるという意味で「スキーマレス」です。
于 2013-06-10T07:07:11.407 に答える
0

ディスラプター パターンを使用して、CoralLogでデータを非同期的にログに記録することもできます。そうすれば、ロガー スレッドで費やす時間を最小限に抑え、すべてのハードワークを実際のファイル I/O を実行するスレッドに渡すことができます。また、コンシューマー スレッドを高速化し、キューの競合を減らすためのメモリ マップ ファイルも提供します。

免責事項:私は CoralLog の開発者の 1 人です。

于 2014-07-08T11:52:37.310 に答える