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

Mar*_*cus 5 .net debugging logging trace system.diagnostics

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

我怎样才能做到这一点?

编辑:

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

wag*_*ghe 4

[编辑]

我错过了问题标题中的部分,您在自定义跟踪侦听器的上下文中提到了这一点。因此,显然您已经编写(或想要编写)一个可以区分 Trace.WriteLine 和 Debug.WriteLine 的自定义 TraceListener。我认为,就 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

[编辑结束]

请参阅我最近针对有关使用 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");
}
Run Code Online (Sandbox Code Playgroud)

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

您是否还想以其他方式控制跟踪和调试输出(也许打开一个然后关闭一个?

如果您使用TraceSources,您可以轻松控制跟踪/日志记录的级别,并且如果您愿意,您可以将某些 TraceSources 的输出发送到一个 TraceListener,将其他 TraceSources 的输出发送到不同的 TraceListener(以及某些 TraceListener)。 TraceSource 甚至可以写入多个 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.");
  }
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中TraceSource有什么好处?

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

  2. 在 app.config 中,您可以将“MyClass”的输出发送到一个或多个 TraceListener。如果您有更多 TraceSource(“YourClass”、“HisClass”),则每个 TraceSource 都可以转到同一个 TraceListener,或者每个可以转到自己的 TraceListener,或者两者之间的任意组合。

  3. 在您的 app.config 中,您可以设置切换和/或过滤,以便指定“MyClass”去往两个 TraceListeners。一个 TraceListener 可以进行过滤,以便仅记录“调试”消息,而另一个 TraceListener 可以进行过滤,以便仅记录“信息”消息。

您还可以使用 TraceSources 做更多事情。阅读上面的链接以及该帖子中的链接。请参阅我在帖子中提到的 Ukadc.Diagnostics项目。Essential.Diagnostics是另一个项目,它提供了 System.Diagnostics 的扩展,并展示了一些使用 System.Diagnostics 的很好的示例。 这是 MSDN 中关于使用 TraceSources、过滤器和 TraceListeners 的一个很好的示例

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

祝你好运!