btl*_*log 7 .net c# tracelistener
我一直在使用System.Diagnostics.Trace进行日志记录是一个非常基本的应用程序.一般来说,我只需要做它.缺点是,如果我打电话
Trace.TraceInformation("Some info");
Run Code Online (Sandbox Code Playgroud)
输出是"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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我输出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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3999 次 |
| 最近记录: |