2013-06-10 41 views
10

私のアプリケーションでは、ある時点で、重いものをログファイルに記録しています。非同期ログ

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

利用可能なデータからJSONを作成し、FILEにロギングすると時間がかかり、元のリクエストの戻り時間に影響します。 アイデアを改善することを考えました。

我々が議論してきたことの一つは、我々のコードで

Executors.newSingleThreadExecutor() 

を使用して、JSONとその後のログへのデータの変換を行いそれにタスクを提出するスレッドプールを作成することです。

スレッドプール自体を管理しているので、いくつかの問題を作成する予定ですか?

誰かがより良いソリューションを共有できるかどうかは分かります。 これでLog4jを使うのはいつも。AsyncAppenderを使用しようとしましたが、望みどおりの結果が得られませんでした。 EJB 3、Jboss 5.0、Log4j、java6を使用しています。

答えて

6

私はあなたが記録するために別のスレッドプールを使用するという点で正しいと信じています。多くの製品では、非同期ロギング機能が表示されます。ログは蓄積され、要求スレッドとは別のスレッドを使用してログファイルにプッシュされます。特に退避環境では、何百万もの要求があり、応答時間は数秒以下にする必要があります。システムの速度を落とすためにログを取るなどの手間はありません。そのため、メモリバッファにログを追加し、それらを適度なサイズのチャンクで非同期にプッシュする方法が使用されています。

注意の言葉 として複数のスレッドがログファイル(複数可)に、メモリログバッファの作業をおこなう予定ログインするためのスレッドプールを使用している間、あなたはログに注意する必要があります。 FIFOタイプのバッファにログを追加して、タイムスタンプでソートされたログファイルにログが出力されるようにする必要があります。また、ファイルへのアクセスが同期されていることを確認し、ログファイルがすべて上下逆になったり、混乱したりしないようにしてください。

+0

私は正しいdirection.Butで前進する自信を与えてくれてありがとう私の唯一の心配は、私はアプリケーションを作成したスレッドプールを使用している...任意の問題を作成するか、または私はこれのためにjbossスレッドプールを活用することができます。 – Rips

3

MongoDB for loggingを使用していますか?

  1. 非同期にを実行することができます。ロギングが遅かったり停止したりした場合には、ユーザの経験が停止することは望ましくありません。 またはそれ以下です。 MongoDBは、 の機能を提供して、ログコレクションへの挿入を開始し、応答コードを待つことはありません。 ( が応答を望む場合、getLastError()を呼び出します。ここではスキップします)
  2. 古いログデータは自動的にLRU出力されます。上限付きのコレクションを使用すると、 はログ用のスペースをあらかじめ割り当てており、いっぱいになるとログは をラップし、指定されたスペースを再利用します。 過度のログ情報でディスクをいっぱいにするリスクはなく、ログアーカイブ/ 削除スクリプトを書く必要はありません。
  3. 問題が発生するのに十分速いです。まず、MongoDBは一般的には で非常に速く、このような問題に対しては十分速いです。次に、 キャップ付きコレクションを使用すると、挿入順序は自動的に保持されます。 は、タイムスタンプでインデックスを作成する必要はありません。これにより、 の処理も高速になります。ログの使用例は、大部分のデータベースの の問題とは反対に、書き込みの数が非常に多い であるため、重要です。
  4. ドキュメント指向の/ JSONは、ログ情報に最適です。非常にフレキシブルであり、意味においては「スキームレス」です。いつでも私たちが望む時間に フィールドを投げることができます。
+1

まあおかげでこれを共有するためのCoralLogの開発者の一人ですが、私たちは今、そのルートを行っていると思ういけません。 – Rips

5

Logbackを参照してください。AsyncAppenderは既に別のスレッドプール、キューなどを提供しています。設定が簡単で、ほぼ同じことをしますが、ホイールを再発明する必要はありません。

+0

これとlog4j.AsyncAppenderの間に違いはありますか?これの一部として、私はasychronosulyだけをログに記録するだけでなく、データをJSONに変換したくありません。 – Rips

+0

@Rips(データ変換のような)他のタスクもある場合は、あなたのソリューションもOKです。 log4jとlogbackについては、log4jの開発は停止されており、ログバックはアクティブです。 log4jとlogbackの詳細については、この[link](http://stackoverflow.com/questions/178215/log4j-vs-logback)を参照してください。 –

0

あなたはまた、非同期的かく乱パターンを使用してデータをログに記録するCoralLogを試すことができます。そうすれば、ロガースレッドで最小限の時間を費やして、すべてのハードワークが実際のファイルI/Oを実行するスレッドに渡されます。また、消費者スレッドを高速化してキューの競合を減らすために、Memory Mapped Filesも提供しています。

免責事項:私は