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