我们有一个自定义的TraceListener实现,它只在接收到特定对象(LogMessage)时记录日志。当直接与Trace.Write(object)方法一起使用时,这一切都工作得很好。
由于性能原因,我希望分离侦听器,这样所有不相关的Trace消息都不会传递给侦听器。因此,我创建了一个仅附加了此侦听器的特定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
}
}
}
}谢谢托马斯
发布于 2013-04-11 21:29:48
也许现在回答已经太晚了,但不管怎样:
通过使用像JustDecompile这样的工具,您可以很容易地看到,TraceSource.TraceData使用了TraceListener.TraceData方法,该方法本身基本上是使用object.ToString()调用WriteLine来获取消息。
因此,您必须覆盖类LogMessage的ToString方法,才能随心所欲地执行操作。
https://stackoverflow.com/questions/14359517
复制相似问题