1

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

私は今、それをリッスンする別のウィンドウトレースアプリケーションの形で強化したいと思います

メインアプリケーションからのトレースに(生成されたとおりに)、レポートします

インターフェースのようなグリッドビュー。今の質問は:

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

制限事項 特定の制限事項のため、データベースのログ記録と読み取りのアプローチを使用できません

アプリケーションのeventLogsを聞くことは、何らかの形で役立ちますか?

提案と時間をありがとう。

4

2 に答える 2

3

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

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));
            });
        }
    }
}
于 2011-01-28T13:50:33.953 に答える
0

log4netnlogを使ってみませんか?

于 2011-01-28T15:07:21.853 に答える