我一直在使用System.Diagnostics.Trace进行日志记录,这是一个非常基本的应用程序。通常,它可以完成我需要做的所有事情。缺点是,如果我打电话
Trace.TraceInformation("Some info");
输出为“SomeApp.Exe信息:0:一些信息”。最初,这使我开心,但不再。我只想输出“一些信息”到控制台。因此,我认为编写一个自定义的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。如果我设置了断点,则消息始终只是“某些信息”。所有其他信息从何而来?
因此,在Console.WriteLine被调用之前的那一刻,我了解了调用堆栈。调用我的WriteLine方法的方法是:System.dll!System.Diagnostics.TraceListener.TraceEvent(System.Diagnostics.TraceEventCache eventCache,字符串源,System.Diagnostics.TraceEventType eventType,int id,字符串消息)+ 0x33字节
当我使用Reflector查看此消息时,一切似乎都非常简单。将字符串发送到Console.WriteLine之后,看不到任何更改字符串值的代码。唯一可能更改基础字符串值的方法是对UnsafeNativeMethods.EventWriteString的调用,该调用的参数是消息的指针。
有谁了解这里发生的事情以及是否可以将输出更改为仅包含我的信息而没有额外的绒毛。可以将字符串“Some info”传递给Console.WriteLine(或与此有关的任何其他方法)似乎是很不可思议的事情,并且输出的字符串是不同的。
编辑:我发现了魔术。显然这不是魔术。在调用WriteLine之前,Write方法从对WriteHeader的调用中获得调用,这是我认为魔术正在发生的地方。
最佳答案
您可以通过在监听器中重写TraceEvent()方法来获取此信息。像这样:
public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string message) {
Console.WriteLine("{0}: {1}", id, message);
}
关于c# - System.TraceListener如何在消息前添加进程名称?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2826211/