2012-12-17 67 views
0

你会觉得Trace.TraceInformation /警告/错误会尊重一个的TraceSwitch为什么Trace方法不尊重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); 
    } 
    } 
} 

将它放到同一个命名空间意味着所有我所要做的就是参考这个项目和重命名跟踪到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朦胧。

回答

2

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

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

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

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

+0

我想你不会认为可配置比硬编码更好,所以据我所知,你告诉我要在自定义*侦听器中执行此操作,而不是自定义Trace。是对的吗?在那种情况下,我如何配置跟踪事件日志的级别?完全重新实现EventLogTraceListener? –

+0

@PeterWone:看看TraceListener.Filter属性:http://msdn.microsoft.com/en-us/library/system.diagnostics.tracelistener.filter.aspx。您可以创建一个'TraceFilter'派生的对象并将其分配给您的侦听器实例的'Filter'属性。 –

相关问题