0

你会认为 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究竟会做什么。

4

1 回答 1

2

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

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

Trace班级本身不是执行您建议的政策的地方。Trace的存在是为了提供一个通用接口和一个可以发送和分发跟踪消息的集中点。确定(通过跟踪开关)发送什么信息是应用程序的工作,而侦听器的工作是确定是否输出该信息。

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

于 2012-12-17T02:17:32.143 回答