2012-12-17 68 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'屬性。 –

相關問題