2011-01-28 8 views
1

これまでのアプリケーションでは、すべてのトレースイベントをハードドライブのファイルに記録しています。カスタムTraceListener Windowsアプリケーション

私は今、(それらが生成される)主なアプリケーションからのトレースに

をリッスン別々のウィンドウトレースアプリケーションの形でそれを強化し、インタフェースなどの

GridViewの上でそれを報告したい

。今質問は:

どのような種類のTraceListener私は、ログ情報を読み取る速度の最大限の利益を得るために使用する必要がありますか?一定の制限のため

制限 、私は、データベース・ロギングを使用して、どのような方法でアプリケーションのeventLogsのヘルプを聞いアプローチ

意志を読んですることはできませんか?

提案と時間をいただきありがとうございます。

+0

これを自分で開発する必要がありますか、またはこれに既存のツールを使用することは許可されていますか? –

+0

私は自分自身の理解のためにこれを独立して開発する必要があります。 –

答えて

3

デフォルトのトレースリスナーは、win32 api OutputDebugStringを使用します。既存のツールを使用して、このメソッドに渡されたメッセージを聴くことができます。例えば、このを見て:

http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx

たぶん、あなたはそれはあなた自身を記述するのにかかる時間を節約すること。

独自の記述を行いたい場合は、トレース・ビューア・アプリケーションにできるだけ早くトレース・メッセージを送信することが重要です。TraceListenerには、ビューアからのネットワーク接続を受け入れることができます。トレース・リスナーがトレース・メッセージを処理するたびに、ネットワークに書き込むことになります。リモートマシン上でトレースメッセージを見ることができないのであれば、もちろんOutputDebugStringに置かれたものを聞くこともオプションです。

これは、トレースを行うアプリケーションのパフォーマンスに影響を与えます。したがって、ネットワークへの書き込みは、トレース書き込みコールをブロックせずに非同期で行うのが最適です。ネットワークへの書き込み中は、処理するためにトレースメッセージをキューに追加する必要があります。

public class NetworkPublishingTraceListener : TraceListener { 

    private List<string> messages = new List<string>(); 
    private AutoResetEvent messagesAvailable = new AutoResetEvent(false); 
    private List<TcpClient> traceViewerApps; 
    private object messageQueueLock = new object(); 

    public NetworkPublishingTraceListener(int port) { 
     // Setup code for accepting and dealing with network connections. 
     (new Thread(BackgroundThread) { IsBackground = true }).Start(); 
    } 

    public override void Write(string message) { 
     if (traceViewerApps.Count == 0) { 
      return; 
     } 

     lock (messageQueueLock) { 
      messages.Add(message);    
     } 
     messagesAvailable.Set(); 
    } 

    public override void WriteLine(string message) { 
     Write(message + Environment.NewLine); 
    } 

    private void BackgroundThread() { 
     while (true) { 
      messagesAvailable.WaitOne(); 
      List<string> messagesToWrite; 
      lock (messageQueueLock) { 
       messagesToWrite = messages; 
       messages = new List<string>(); 
      } 
      traceViewerApps.ForEach(viewerApp => { 
       StreamWriter writer = new StreamWriter(viewerApp.GetStream()); 
       messagesToWrite.ForEach(message => writer.Write(message)); 
      }); 
     } 
    } 
} 
+0

ありがとう...マークRussinovichsの驚くほど役に立つツールを知っています。しかし、私は自分自身のために1つを開発する必要があります。 –

+0

@ this-Meトレースメッセージを外部アプリケーションに公開するTraceListenerの実装を開始する方法の簡単なコード例を追加しました。 –

+0

ありがとうAndreas ...私はそれに取り組んでいます。 :) –

0

は、なぜあなたはlog4netのまたはnlogを使用しないでください:

ここでは、おそらく作品の簡単な例はありますか?

+1

こんにちはGor ...理由は、私はそれを実装することによって学びたいです。 ありがとう:D –

関連する問題