你会觉得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朦胧。
我想你不会认为可配置比硬编码更好,所以据我所知,你告诉我要在自定义*侦听器中执行此操作,而不是自定义Trace。是对的吗?在那种情况下,我如何配置跟踪事件日志的级别?完全重新实现EventLogTraceListener? –
@PeterWone:看看TraceListener.Filter属性:http://msdn.microsoft.com/en-us/library/system.diagnostics.tracelistener.filter.aspx。您可以创建一个'TraceFilter'派生的对象并将其分配给您的侦听器实例的'Filter'属性。 –