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