2013-01-16 58 views
0

我們有一個自定義TraceListener實現,它只在收到特定對象(LogMessage)時記錄。直接使用Trace.Write(object)方法時,這一切都可以正常工作。如何通過TraceSource調用TraceListener.Write(object)

由於性能原因,我想單獨監聽器,因此所有不相關的跟蹤消息都不會傳遞給監聽器。因此,我創建了一個特定的TraceSource,只有這個監聽器被連接。

現在我努力使用TraceSource將我的自定義日誌對象(LogMessage)傳遞給偵聽器。 TraceSource.TraceData(TraceEventType, int, object)總是調用TraceListener.Write(string)方法,而不是TraceListener.Write(object)方法。

有沒有什麼辦法可以將自定義對象傳遞給Listener使用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 
      } 
     } 
    } 
} 

感謝 托馬斯

回答

1

也許爲時已晚了一個答案,但無論如何:

通過使用工具,如JustDecompile你可以很容易地看到TraceSource.TraceData用途TraceListener.TraceData方法本身基本上調用WriteLine和object.ToString()作爲消息。

因此,您必須重寫您的類LogMessage的ToString方法才能按需執行。

+0

感謝您的回覆。我不知道TraceListener.TraceData的定義使用了ToString()方法。但是我們需要偵聽器中傳遞的對象,然後將其轉回到自定義日誌消息併發送到日誌服務器。您的信息使我想到了重寫TraceListener.TraceData並處理覆蓋中的對象。我想這會起作用,併爲我的問題帶來解決方案。在週末之後會弄清楚。非常感謝! –