为什么Trace方法不尊重TraceSwitch?

时间:2012-12-17 01:17:19

标签: .net trace

您认为Trace.TraceInformation / Warning / Error会尊重TraceSwitch中设置的级别

调查显示,可能存在任意数量的TraceSwitch实例,因此不清楚哪一个应该控制行为。 一种使TraceSwitch实例从配置中获取其级别的方法 - 您只需在创建实例时指定匹配的名称。

如果我设计的东西,Trace类将有一个静态属性TraceSwitch,它将由配置中的第一个跟踪开关定义设置,而TraceInfo等方法将表现得像这样

    public static void TraceInformation(string message, params object[] p)
    {
      if (TraceSwitch.TraceInfo)
        //base behaviour
    }

这并不难作为包装器生成。

namespace System.Diagnostics
{
  public static class TraceEx
  {
    private static TraceSwitch __traceSwitch;
    public static TraceSwitch TraceSwitch
    {
      get { return __traceSwitch; }
      set { __traceSwitch = value; }
    }
    static TraceEx()
    {
      __traceSwitch = new TraceSwitch("Default", "Default trace level is Off");
    }
    public static void TraceError(string message, params object[] p)
    {
      if (TraceSwitch.TraceError)
        Trace.TraceError(message, p);
    }
    public static void TraceInformation(string message, params object[] p)
    {
      if (TraceSwitch.TraceInfo)
        Trace.TraceInformation(message, p);
    }
    public static void TraceWarning(string message, params object[] p)
    {
      if (TraceSwitch.TraceWarning)
        Trace.TraceWarning(message, p);
    }
    public static void Write(string message, params object[] p)
    {
      if (TraceSwitch.TraceVerbose)
        Trace.Write(string.Format(message, p));
    }
    public static void WriteLine(string message, params object[] p)
    {
      Write(message + "\r\n", p);
    }
  }
}

将它放在同一个命名空间中意味着我所要做的就是引用该项目并将Trace重命名为TraceEx。我提出的问题是:为什么微软不这样做呢?我有没有看到一些隐约可见的问题?


嗯,这是出乎意料的(见接受的答案)。这只表明我怀疑我没有理解宏伟的设计是正确的。所有这些都变成了这个:

<userSettings>
    <TraceFilterExperiment.Properties.Settings>
        <setting name="TraceLevel" serializeAs="String">
            <value>Warning</value>
        </setting>
    </TraceFilterExperiment.Properties.Settings>
</userSettings>

var eventTypeFilter = new EventTypeFilter(Properties.Settings.Default.TraceLevel);
foreach (TraceListener L in Trace.Listeners) 
  L.Filter = eventTypeFilter;

但我仍然对使用TraceSwitch真正的内容感到朦胧。

1 个答案:

答案 0 :(得分:2)

您建议的行为已经存在,虽然形式有所不同:您修改了侦听​​器以启用不同的错误级别。

根据您的建议行为,将不同级别发送到不同位置(例如,详细信息到日志文件,但只有控制台出现严重错误)需要将默认跟踪开关设置为“允许所有内容”,就像它与现有的行为有关。换句话说,如果程序员想要按原样使用Trace开关,他将不得不创建一个允许所有内容的虚拟跟踪开关,并以某种方式确保它是第一个定义的跟踪开关。例如,很可能在某些其他配置文件(即不是application.exe.config)中定义了开关,并且无法保证配置文件的加载顺序。

Trace类本身不是强制执行您所建议的策略的地方。存在Trace以提供公共接口和集中点,可以在其中发送跟踪消息然后进行分发。应用程序的工作是确定(通过跟踪开关)发送的信息,并确定是否输出该信息是听众的工作。

您建议的行为使Trace的特定应用程序更容易。它使所有其他应用程序更容易混淆,更困难,并且可能不一致。