gpt4 book ai didi

c# - System.TraceListener 如何在消息前添加进程名称?

转载 作者:太空狗 更新时间:2023-10-29 20:29:20 24 4
gpt4 key购买 nike

我一直在研究使用 System.Diagnostics.Trace 进行日志记录是一个非常基本的应用程序。通常它会完成我需要它做的所有事情。缺点是如果我调用

Trace.TraceInformation("Some info");

输出是“SomeApp.Exe Information: 0: Some info”。最初这让我很开心,但现在不再开心了。我只想输出“一些信息”到控制台。所以我认为编写自定义 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(或与此相关的任何其他方法)并且输出的字符串不同,这似乎是邪恶的魔法。

编辑:我发现了魔法。显然这不是魔法。 Write 方法在调用 WriteLine 之前从对 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com