我一直在寻找使用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") ?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top