0

特定のオブジェクト (LogMessage) が受信されたときにのみログに記録するカスタム TraceListener 実装があります。メソッドで直接使用する場合、これはすべてうまく機能しTrace.Write(object)ます。

パフォーマンス上の理由から、リスナーを分離したいので、関係のないトレース メッセージはすべてリスナーに渡されません。したがって、このリスナーのみがアタッチされた特定の TraceSource を作成しました。

現在、TraceSource を使用してカスタム ログ オブジェクト (LogMessage) をリスナーに渡すのに苦労しています。は、メソッドではなく、TraceSource.TraceData(TraceEventType, int, object)常にメソッドを呼び出します。TraceListener.Write(string)TraceListener.Write(object)

TraceSource を使用してリスナーにカスタム オブジェクトを渡す方法はありますか?

サンプルコード:

using System.Diagnostics;

namespace Sample
{
    public class LogMessage
    {
        public byte[] Data { get; set; }
        //...
    }

    public class Sample
    {
        public void Foo()
        {
            var ts = new TraceSource("Test");

            var lm = new LogMessage();
            //lm.Data = ...;

            //this works: calls the Write(object) method in listener
            Trace.Write(lm);

            //this doesn't work: calls the Write(string) method in listener
            ts.TraceData(TraceEventType.Information, 0, lm);
        }
    }

    public class MyListener : TraceListener
    {
        public override void Write(string message)
        {
            //not in use
        }

        public override void WriteLine(string message)
        {
            //not in use
        }

        public sealed override void Write(object o)
        {
            if (o is LogMessage)
            {
                //do someting with the LogMessage
            }
        }
    }
}

ありがとうトーマス

4

1 に答える 1

1

答えには遅すぎるかもしれませんが、とにかく:

JustDecompile のようなツールを使用すると、TraceSource.TraceData が TraceListener.TraceData メソッドを使用し、それ自体が基本的にメッセージの object.ToString() で WriteLine を呼び出すことを簡単に確認できます。

そのため、必要に応じて LogMessage クラスの ToString メソッドをオーバーライドする必要があります。

于 2013-04-11T13:29:48.333 に答える