你會覺得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'屬性。 –