您认为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真正做的内容感到朦胧。
答案 0 :(得分:2)
您建议的行为已经存在,虽然形式有所不同:您修改了侦听器以启用不同的错误级别。
根据您的建议行为,将不同级别发送到不同位置(例如,详细信息到日志文件,但只有控制台出现严重错误)需要将默认跟踪开关设置为“允许所有内容”,就像它与现有的行为有关。换句话说,如果程序员想要按原样使用Trace开关,他将不得不创建一个允许所有内容的虚拟跟踪开关,并以某种方式确保它是第一个定义的跟踪开关。例如,很可能在某些其他配置文件(即不是application.exe.config)中定义了开关,并且无法保证配置文件的加载顺序。
Trace
类本身不是强制执行您所建议的策略的地方。存在Trace
以提供公共接口和集中点,可以在其中发送跟踪消息然后进行分发。应用程序的工作是确定(通过跟踪开关)发送的信息,并确定是否输出该信息是听众的工作。
您建议的行为使Trace的特定应用程序更容易。它使所有其他应用程序更容易混淆,更困难,并且可能不一致。