2011-12-21 9 views
0

さまざまなソース(チャットルームやプライベートチャット)からメッセージを受信して​​いるアプリケーションがあります。アプリケーションの複数のインスタンスを開くことができ、最終的な結果は次のシナリオのようなものでなければなりません:現在チャットログ管理、パフォーマンス別

Desired data flow

、各アプリケーションは、名前がログオンに使用したアカウントであるディレクトリにログを保存しますチャットサーバー。プライベートチャットソース(各アプリケーションインスタンスに固有の問題)では問題ではありませんが、共通のチャットルームに関する同じログを複数回保存するのは無駄です。ログはプレーンテキスト形式で保存されるため、アプリケーションを経由せずにアクセスして読み取ることができます。

ログを別々のフォルダに保存しないと、複数のプロセスから同時に同じファイルにアクセスするためI/O例外が発生する可能性があります。保存しようとしている行が 'すでに他のアプリケーションによって作成されています。私は操作全体を最適化し、コードの可読性を維持しようとする必要があります。

はまた、ラインを書くための私の現在のアプローチは以下の通りです:

ログが常に書かれていることを考慮すると、最も効率的な解決策ではないかもしれない、
public void Write(string message) 
    { 
     using (var writer = new StreamWriter(_fileName, File.Exists(_fileName))) 
      writer.WriteLine(message); 
    } 

。まとめ

、私の質問は以下のとおりです。

  • は、どのように私は彼らの形式(プレーンテキスト)を維持したが、前述の重複/アクセスの問題を解決し、独自のログフォルダ/データベースを作成するのですか?
  • 可能であれば、書き込み方法を改善するにはどうすればよいですか?ログは常に書き込まれる必要があることを覚えておいてください。アプリケーションが終了するとStreamWriterを閉じることは、アプリケーションが長期間実行されるため、適切な解決策にはなりません。

ありがとうございます。

+0

なぜあなたは、このようなlog4netのようロギングフレームワークを使用していませんか? –

+0

@AaronMcIver:それは公正な点ですが、重複しないデータを1つのファイルに書き込む複数のインスタンスを回避するのに役立つことはありません。 – R0MANARMY

+1

あなたのスケッチは、チャットルーム1からの重複ログはログリポジトリでのみ重複とみなされることを示唆しています。それは事実ですか?はいの場合、2つの結合されていないアプリインスタンスで重複除外することはできません。 –

答えて

0

私があなただったら、すでにオープンソースのフレームワークを公開しています。 NLog。それは十分速く、非同期ロギングをサポートしているので、探しているものを正確に実行する必要があります。

0

私は答えやコメントとしてこれを記述する必要がありますが、部屋が必要な場合があります場合は、わからない:あなたが希望する結果を示すスケッチを述べ

を、私が言ったように、これはあなたの場合は重複除去を防止することができますインスタンスを結合しないでください。だからここに私が示唆しているものです:シングルトンであり、あなたのスケッチでのアプリケーションインスタンスである、あなたのスケッチ

  • のLogProcessorの一番下に座っているログ・ライター、:次の2つのアプリケーションを作成

    • LogProcessorインスタンスの起動時に、LogWriterが起動している場合は、LogWriterが起動されるか、またはLogWriterに接続されます。
    • LogProcessorは、着信ログ要求を処理します。必要に応じて前処理を行い、Timestamp、ChatroomID、UserID(ユニークである必要はありません)、テキスト、および多分ハッシュのタプルとしてLogWriterに送信します。簡単に削除する。インスタンス内のハッシュを計算するには、複数のコアをより良く利用し
    • ログ・ライターは、ハッシュを含む、タイムスタンプでソートされた吊りリストを保持し、すぐにアイテム、ログ・ライターの残りの部分について重複するアイテム
    • を破棄することができますログファイルのパスを決定します。ストリームがすでにそのパスに対して開いている場合は、項目を書き出し、そのストリームのLastUsedタイムスタンプを更新します。
    • ストリームが開いていない場合、LogWriterはストリームを開き、次に書き込みます。
    • ストリームの最大数に達すると、(上記のLastUsed Timestampのように)最も古いストリームが閉じられ、必要な新しいストリームが開きます。
  • 1

    私はあなたのニーズに合った簡単な解決策を考え出しましたが、完全にはわかりません。

    私のアプローチは、チャットセッション/ルームごとに1つのファイルを使用することです。このようなセッションが開始された場合、アプリケーションはそのファイルの作成/オープンを試み、そのファイルに対する書き込みロックを作成します。ファイルがロックされているためIOExceptionが発生した場合、ロギングを完全にスキップできます。

    +0

    体系的な例外処理を中継するのを避けるために別のロックを実装することができる点を除いて、かなり簡単で適切な解決策と思われます。ありがとう! – user1098567

    0

    おそらく、ロガーがユーザーではなくチャットルームに接続されるようにアプリケーションのデザインを変更してください。

    ユーザーがチャットルームに入ると、チャットルームはロガーオブジェクトをユーザーに渡します。

    この方法では、すべてのユーザーが同じロガーを使用します。問題は次のようになります。1消費者(ロガー)と複数のプロデューサー(ロギングしたいすべてのユーザー)。

    は、この投稿にmy replyを参照してください:

    Write to FileOutputStream from multiple threads in Java

    ここ

    https://stackoverflow.com/a/8422621/1007845

    関連する問題