gpt4 book ai didi

.net - 如何区分自定义跟踪监听器中的 Trace 和 Debug 调用?

转载 作者:行者123 更新时间:2023-12-04 20:22:40 24 4
gpt4 key购买 nike

Trace.Listeners 和 Debug.Listeners 共享相同的内部集合,因此我无法向 Trace.Listeners 添加跟踪监听器,向 Debug.Listeners 添加调试监听器以区分它们。

我怎样才能做到这一点?

编辑:

为什么我要这样做只是因为我正在为我们的应用程序编写一个日志记录层,并且我想在整个系统中跟踪不同的日志,其中 Debug/Trace 是两个日志源(还有几个其他源) ) 我要跟踪。

最佳答案

[编辑]

我错过了问题标题中的部分,您在自定义跟踪监听器的上下文中提到了这一点。因此,显然您已经编写(或想要编写)一个自定义 TraceListener,它可以区分 Trace.WriteLine 和 Debug.WriteLine。我认为,就 TraceSources 优于 Trace.WriteLine 和 Debug.WriteLine 而言,我在下面所说的一切仍然适用。但是,我的回答不一定能回答您的问题,只是说我认为不可能从 TraceListener 的 Write 和 WriteLine 方法中判断它们是否最终是由于调用 Trace.WriteLine 与 Debug 而被调用的.WriteLine。

即使您可以从自定义 TraceListener 中分辨出对 Write 或 WriteLine 调用的最终来源,也不清楚您要完成什么。无论您想要完成什么,我都必须相信,如果您将代码中的日志记录语句基于 TraceSources 开始,会更容易实现。

您能否在原始问题中添加一些代码,以显示如何编写一些应用程序代码,添加一些对 Trace.WriteLine 和 Debug.WriteLine 的调用。此外,显示来自您的自定义 TraceListener 的一些代码,这些代码显示如果您可以区分 Trace.WriteLine 和 Debug.WriteLine,您希望采取什么操作。就像是:

public void WriteLine(string msg)
{
if (WasWrittenFromTrace)
{
//Before writing to output, add "TRACE" to front of message
WriteToOutput("TRACE: {0}", msg);
}
else
if (WasWrittenFromDebug)
{
//Before writing to output, add "DEBUG" to front of message
WriteToOutput("DEBUG: {0}", msg);
}
}

[结束编辑]

this answer我最近发布了一个关于使用 System.Diagnostics 的问题的回复。

那里有很多信息,并且该答案中的链接中有很多关于如何使用 System.Diagnostics 的信息,重点是使用 TraceSources 而不是 Trace.WriteLine 和 Debug.WriteLine。

从你的问题来看,听起来你可能想写一些这样的代码:
public void MyFunction(int x, int y)
{
Trace.WriteLine("Entering MyFunction. x = {0}, y = {1}", x, y);

int product = x * y;

Debug.WriteLine("product = {0}", product);

Trace.WriteLine("Exiting MyFunction");
}

并且您显然希望 Trace 输出转到一个 TraceListener,而 Debug 输出转到另一个 TraceListener。或者在 TraceListener 中(也许您会自己编写),您希望能够判断给定的 Write/WriteLine 实际上是 Trace.Write 还是 Debug.Write。我不认为这真的可能。

您是否还想以其他方式控制 Trace 和 Debug 输出(也许打开一个关闭?

如果您使用 TraceSources ,您可以轻松控制跟踪/日志记录的级别,如果您愿意,您可以将某些 TraceSources 的输出发送到一个 TraceListener,将其他 TraceSources 的输出发送到另一个 TraceListener(有些 TraceSources 甚至可以写入多个跟踪监听器)。

因此,使用 TraceSources,您可以编写如下代码:
public class MyClass
{
//Static variable, so all instances of MyClass will have access to the same instance
//of the TraceSource
private static readonly TraceSource ts = new TraceSource("MyClass");

public void MyMethod(int x, int y)
{
ts.TraceEvent(TraceEventType.Information, 0, "Entering MyMethod. x = {0}, y = {1}", x, y);

int product = x * y;

ts.TraceEvent(TraceEventType.Debug, 0, "Product = {0}", product);

ts.TraceEvent(TraceEventType.Information, 0, "Exiting MyMethod.");
}
}

在这个例子中 TraceSource 有什么好处?
  • 在您的 app.config 中,您可以打开或关闭“MyClass”TraceSource 或将其设置为某个级别。如果将其设置为“调试”,则会写入调试和信息消息。如果将其设置为“信息”,则只会记录信息消息。如果设置高于“信息”,则不会记录示例中的任何消息。
  • 在您的 app.config 中,您可以将“MyClass”的输出发送到一个或多个 TraceListeners。如果您有更多的 TraceSource(“YourClass”、“HisClass”),则每个都可以转到同一个 TraceListener,或者每个都可以转到自己的 TraceListener,或者两者之间的任意组合。
  • 在你的 app.config 你可以设置 switching和/或 filtering这样“MyClass”被指定去,例如,两个 TraceListeners。一个 TraceListener 可以过滤,以便只记录“调试”消息,而另一个可以过滤,以便只记录“信息”消息。

  • 您可以使用 TraceSources 做更多事情。阅读上面的链接和该帖子中的链接。见 Ukadc.Diagnostics我在帖子中提到的项目。 Essential.Diagnostics是另一个提供 System.Diagnostics 扩展以及展示一些使用 System.Diagnostics 的很好示例的项目。 Here is a good example from MSDN about using TraceSources, filters, and TraceListeners .

    在我看来,如果您尝试使用 TraceSources 而不是 Trace.* 和 Debug.* 将跟踪/日志记录添加到您的代码中,您会更好。

    祝你好运!

    关于.net - 如何区分自定义跟踪监听器中的 Trace 和 Debug 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4692240/

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