如何使用System.Diagnostics.TraceSource而不是System.Diagnostics.Debug类?

时间:2015-08-10 19:56:09

标签: c# .net logging conditional-compilation system.diagnostics

我正在阅读.NET Framework Development Guide - How to: Use TraceSource and Filters with Trace Listeners,并在开头就有以下建议:

  

版本2.0的主要区别在于可以通过TraceSource类的实例启动跟踪。 TraceSource旨在用作增强的跟踪系统,可用于代替旧TraceDebug跟踪类的静态方法。 熟悉的TraceDebug类仍然存在,但建议的做法是使用TraceSource类进行跟踪。

我理解如何使用TraceSource代替Trace类,但我还没有理解它是如何用来取代Debug的。

以下是一本书C# 5.0 in a Nutshell: The Definitive Reference的引用:

  

调试 跟踪 是提供基本日志记录的静态类   断言能力。
  这两个类非常相似; 主要    差异化因素是其预期用途

现在,这里有一个更深入的差异描述:

  

Debug类的所有方法都是用 [有条件的(" DEBUG")] 定义的。
  Trace类的所有方法都是用 [有条件的(" TRACE")] 定义的。

因此,它导致在Realease构建中消除Debug次调用:

  

这意味着您对DebugTrace发出的所有来电都会被删除   编译器,除非您定义 DEBUG TRACE 符号。

TraceSource如何解释这种差异?

1 个答案:

答案 0 :(得分:0)

我提出的最佳解决方案是编写扩展方法。如果那里有更好的东西,我会将你的答案标记为已接受:)。

public static class TraceSourceExtentions
{
    [Conditional("DEBUG")]
    public static void TraceDebug(this TraceSource traceSource, string message)
    {
        traceSource.TraceEvent(
            eventType: TraceEventType.Verbose,
            id: 0,
            format: message);
    }

    [Conditional("DEBUG")]
    public static void TraceDebug(this TraceSource traceSource, string format, params object[] args)
    {
        traceSource.TraceEvent(
            eventType: TraceEventType.Verbose,
            id: 0,
            format: format,
            args: args);
    }
}

这个解决方案并不能让我满意,因为如果有多个程序集需要调试跟踪,我们注定要在这些程序集中考虑代码复制或创建外部冗余依赖项(另一个将包含此类的程序集。)