【问题标题】:How to use System.Diagnostics.TraceSource instead of System.Diagnostics.Debug class?如何使用 System.Diagnostics.TraceSource 而不是 System.Diagnostics.Debug 类?
【发布时间】:2015-11-02 20:50:32
【问题描述】:

我正在阅读.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

DebugTrace 是提供基本日志记录和 断言能力。
这两个类非常相似; 主要 差异化因素是他们的预期用途

现在,这里是对差异的更深入描述:

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

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

这意味着您对DebugTrace 的所有调用都会被 编译器,除非您定义 DEBUGTRACE 符号。

TraceSource 如何解释这种差异?

【问题讨论】:

  • 我不确定问题是什么,TraceSource 不记录 Trace.XXXDebug.XXX 通话,只记录 TraceSource.XXXX 通话。它不必考虑这种差异,因为它无论如何都不会听那些电话......欢迎您查看TraceSource代码:referencesource.microsoft.com/#System/compmod/system/…TRACE仍然需要定义为记录通话。
  • @Ron: 抱歉我不够清楚 :) 您如何将 Debug.WriteLine() 替换为对 TraceSource traceSource; 的调用,以便它们也将从 DEBUG中删除> 构建?
  • @Ron:我查看了源代码TraceSource.cs 并没有找到任何标记为[Conditional("DEBUG")] 的方法。真的有可能我遗漏了什么,请你指出那个方法吗?
  • 它们被标记为[Conditional("TRACE")],因此只要定义了TRACE 符号,跟踪仍将在发布中起作用。如果您希望将它们从 debug 构建中剥离,请进入构建属性并取消选中调试构建设置的“定义 TRACE 常量”复选框。DEBUG 并不意味着 TRACE。
  • 顺便说一句,TRACE 也是默认为发布版本定义的,您可以以相同的方式更改它。您还可以通过在文件顶部包含 #undef TRACE 来取消对单个代码文件的定义。

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


【解决方案1】:

我想出的最佳解决方案是编写扩展方法。如果有什么更好的,我会将您的答案标记为已接受:)。

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);
    }
}

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

【讨论】:

    猜你喜欢
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 2011-09-14
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 2015-08-16
    相关资源
    最近更新 更多