System.TraceListener如何在消息中添加进程名称?

我一直在寻找使用System.Diagnostics.Trace进行日志记录是一个非常基本的应用程序。 一般来说,我只需要做它。 缺点是,如果我打电话

Trace.TraceInformation("Some info"); 

输出是“SomeApp.Exe Information:0:Some info”。 最初这招待我但不再。 我想将“Some info”输出到控制台。 所以我认为编写一个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。 如果我提出一个断点,那么消息总是只是“一些信息”。 所有其他信息来自哪里?

所以我在调用Console.WriteLine之前看了一下调用堆栈。 调用我的WriteLine方法的方法是:System.dll!System.Diagnostics.TraceListener.TraceEvent(System.Diagnostics.TraceEventCache eventCache,string source,System.Diagnostics.TraceEventType eventType,int id,string message)+ 0x33 bytes

当我使用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); } 

如果使用格式化,还需要覆盖此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); 

当data [0] == 9时,覆盖将仅输出“线程9等待\ n”

为什么不使用Trace.WriteLine("SomeInfo")而不是Trace.TraceInformation("SomeInfo")