System.Tracelistener如何带有过程名称的消息?
-
26-09-2019 - |
题
我一直在寻找使用system.diagnostics.trace进行记录是一个非常基本的应用程序。通常,这一切都需要做。不利的一面是,如果我打电话
Trace.TraceInformation("Some info");
输出为“ someapp.exe信息:0:一些信息”。最初,这让我很高兴,但不再。我只想将“一些信息”输出到主机。因此,我认为编写Cusom Tracelistener,而不是使用内置的Consoletracelistener,可以解决该问题。我可以看到第二个结肠后所有文本的特定格式。这是我尝试查看这是否有效的尝试。
class LogTraceListener : TraceListener
{
public override void Write(string message)
{
int firstColon = message.IndexOf(":");
int secondColon = message.IndexOf(":", firstColon + 1);
Console.Write(message);
}
public override void WriteLine(string message)
{
int firstColon = message.IndexOf(":");
int secondColon = message.IndexOf(":", firstColon + 1);
Console.WriteLine(message);
}
}
如果我输出FirstColon的值,则始终为-1。如果我提出了一个断点,则消息始终只是“一些信息”。所有其他信息来自哪里?
因此,我在控制台之前就查看了呼叫堆栈。称为我的writeline方法的方法是:system.dll!system.diagnostics.tracelistener.traceevent(system.diagnostics.diagnostics.traceeventcache eventcache eventcache,string source,system.diagnostics.diagnostics.traceeventtype eventpe eventpe eventpe,int id,int id,字符串,字符串) + 0x33 bytes) + 0x33 bytes + 0x33 bytes + 0x33 bytes + 0x33 bytes
当我使用反射器查看此消息时,这一切似乎都很简单。将字符串发送给Console.Writeline后,我看不到任何更改字符串值的代码。唯一可以明智地更改基础字符串值的方法是呼叫unsafenativemethods.eventwritestring,其参数是通往消息的指针。
有人知道这里发生了什么吗?我是否可以将输出更改为我的消息,而没有其他绒毛。我可以将字符串的“一些信息”传递给console.writeline(或任何其他方法)和输出的字符串不同,这似乎是邪恶的魔法。
编辑:我找到了魔术。显然这不是魔术。写入方法在打电话给Writeline之前从呼叫打电话给WriteHeader,这是我认为魔术正在发生的地方。
解决方案
您可以通过在侦听器中覆盖TraceEvent()方法来获得此功能。像这样:
public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string message) {
Console.WriteLine("{0}: {1}", id, message);
}
其他提示
如果使用格式,您还需要覆盖此TraceEvent超载:
public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType,
int id, string format, params Object[] data)
{
base.WriteLine(String.Format(format, data));
}
例如:
Trace.TraceInformation("Thread {0} Waiting", Thread.CurrentThread.ManagedThreadId);
当数据[0] == 9时,Override将仅输出“线程9等待 n”
为什么不使用 Trace.WriteLine("SomeInfo")
代替 Trace.TraceInformation("SomeInfo")
?