如何区分自定义跟踪侦听器中的Trace和Debug调用?

时间:2011-01-14 14:45:39

标签: .net debugging logging trace system.diagnostics

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

我怎样才能做到这一点?

编辑:

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

1 个答案:

答案 0 :(得分:4)

[编辑]

我错过了问题标题中的部分,您在自定义跟踪侦听器的上下文中提到了这一部分。因此,显然您已编写(或想要编写)自定义TraceListener,可以区分Trace.WriteLine和Debug.WriteLine。我认为,就TraceSources优于Trace.WriteLine和Debug.WriteLine而言,我在下面说的所有内容仍然适用。但是,我的回答并不一定能回答你的问题,只是说我不认为可以从TraceListener的Write和WriteLine方法中判断它们是否最终因为调用Trace.WriteLine vs 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,您可以轻松控制跟踪/日志记录的级别,如果您愿意,可以将一些TraceSource的输出发送到一个TraceListener和其他人的输出到另一个TraceListener(有些TraceSources甚至可以写入多个TraceListener)。

因此,使用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在这个例子中有什么好处?

  1. 在您的app.config中,您可以打开或关闭“MyClass”TraceSource或将其设置为某个级别。如果将其设置为“Debug”,则将写入Debug和Information消息。如果将其设置为“信息”,则仅记录信息消息。如果设置的值高于“信息”,则不会记录示例中的任何消息。

  2. 在app.config中,您可以将“MyClass”的输出发送给一个或多个TraceListeners。如果你有更多的TraceSources(“YourClass”,“HisClass”),每个都可以转到相同的TraceListener,或者每个都可以转到它自己的TraceListener,或者它们之间的任何组合。

  3. 在app.config中,您可以设置switching和/或filtering,以便指定“MyClass”转到例如两个TraceListeners。一个TraceListener可以过滤,只记录“Debug”消息,另一个可以过滤,只记录“Information”消息。

  4. 您可以使用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。*来为你的代码添加跟踪/记录,你会更好。

    祝你好运!