HOW TO:建立和初始化追蹤來源
更新:2007 年 11 月
不論是否有使用組態檔,都可以建立及初始化追蹤來源。建議的方法是使用組態檔來協助重新設定追蹤來源於執行階段所產生的追蹤。
若要使用組態檔建立及初始化追蹤來源
下列程式碼範例的用意,是要與應用程式組態檔一起搭配執行 (如步驟 2 中所示)。組態檔會在初始化應用程式時,初始化追蹤來源的設定。此應用程式可動態變更組態檔所設定的屬性,以覆寫使用者指定的任何設定。例如,您可能會想要確保重大訊息一定會傳送到文字檔,不論目前的組態設定為何。下列程式碼範例將示範如何覆寫組態檔設定,以確保重大訊息會輸出到追蹤接聽項。在應用程式執行時變更組態檔設定,並不會變更最初的設定;若要做這樣的處理,您必須重新啟動應用程式,或是利用 Refresh 方法,以程式設計方式重新整理應用程式。
using System; using System.Diagnostics; using System.Threading; namespace TraceSourceApp { class Program { private static TraceSource mySource = new TraceSource("TraceSourceApp"); static void Main(string[] args) { Activity1(); // Change the event type for which tracing occurs. // The console trace listener must be specified // in the configuration file. First, save the original // settings from the configuration file. EventTypeFilter configFilter = (EventTypeFilter)mySource.Listeners["console"].Filter; // Then create a new event type filter that ensures // critical messages will be written. mySource.Listeners["console"].Filter = new EventTypeFilter(SourceLevels.Critical); Activity2(); // Allow the trace source to send messages to listeners // for all event types. This statement will override // any settings in the configuration file. mySource.Switch.Level = SourceLevels.All; // Restore the original filter settings. mySource.Listeners["console"].Filter = configFilter; Activity3(); mySource.Close(); return; } static void Activity1() { mySource.TraceEvent(TraceEventType.Error, 1, "Error message."); mySource.TraceEvent(TraceEventType.Warning, 2, "Warning message."); } static void Activity2() { mySource.TraceEvent(TraceEventType.Critical, 3, "Critical message."); mySource.TraceInformation("Informational message."); } static void Activity3() { mySource.TraceEvent(TraceEventType.Error, 4, "Error message."); mySource.TraceInformation("Informational message."); } } }
在此程式碼範例中,建立下列組態檔來初始化 TraceSourceTraceSourceApp。可執行的主應用程式裝載的應用程式組態檔位在與應用程式相同的目錄。組態檔的名稱為具有 .config 副檔名的應用程式名稱。例如,TraceSourceApp.exe 可以與稱為 TraceSourceApp.exe.config 的組態檔產生關聯;下列組態檔範例將示範如何初始化主控台追蹤接聽項,以及上一個步驟中建立的追蹤來源之文字寫入器追蹤接聽項。除了設定追蹤接聽項之外,組態檔也會針對這兩個接聽項建立篩選條件,並為追蹤來源建立來源參數。此外,有示範兩個技巧來加入追蹤接聽項:將接聽項直接加入到追蹤來源,並將接聽項加入到共用接聽項集合,然後根據名稱將它加入到追蹤來源。會使用不同的來源層級來初始化這兩個接聽項所識別的篩選條件,如此只會讓其中一個接聽項寫入某些訊息。
<configuration> <system.diagnostics> <sources> <source name="TraceSourceApp" switchName="sourceSwitch" switchType="System.Diagnostics.SourceSwitch"> <listeners> <add name="console" type="System.Diagnostics.ConsoleTraceListener"> <filter type="System.Diagnostics.EventTypeFilter" initializeData="Warning"/> </add> <add name="myListener"/> <remove name="Default"/> </listeners> </source> </sources> <switches> <add name="sourceSwitch" value="Warning"/> </switches> <sharedListeners> <add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="myListener.log"> <filter type="System.Diagnostics.EventTypeFilter" initializeData="Error"/> </add> </sharedListeners> </system.diagnostics> </configuration>
若要在不使用組態檔的情況下初始化追蹤來源、接聽項和篩選條件
您可以完全透過程式碼,藉由追蹤來源來檢測追蹤,而不需要使用組態檔。這不是建議的作法,但是在您不想要根據組態檔來確保追蹤作業的情況下,可以採取這個作法。
using System; using System.Diagnostics; using System.Threading; namespace TraceSourceApp { class Program { private static TraceSource mySource = new TraceSource("TraceSourceApp"); static void Main(string[] args) { mySource.Switch = new SourceSwitch("sourceSwitch", "Error"); mySource.Listeners.Remove("Default"); TextWriterTraceListener textListener = new TextWriterTraceListener("myListener.log"); ConsoleTraceListener console = new ConsoleTraceListener(false); console.Filter = new EventTypeFilter(SourceLevels.Information); console.Name = "console"; textListener.Filter = new EventTypeFilter(SourceLevels.Error); mySource.Listeners.Add(console); mySource.Listeners.Add(textListener); Activity1(); // Set the filter settings for the // console trace listener. mySource.Listeners["console"].Filter = new EventTypeFilter(SourceLevels.Critical); Activity2(); // Allow the trace source to send messages to // listeners for all event types. mySource.Switch.Level = SourceLevels.All; // Change the filter settings for the console trace listener. mySource.Listeners["console"].Filter = new EventTypeFilter(SourceLevels.Information); Activity3(); mySource.Close(); return; } static void Activity1() { mySource.TraceEvent(TraceEventType.Error, 1, "Error message."); mySource.TraceEvent(TraceEventType.Warning, 2, "Warning message."); } static void Activity2() { mySource.TraceEvent(TraceEventType.Critical, 3, "Critical message."); mySource.TraceInformation("Informational message."); } static void Activity3() { mySource.TraceEvent(TraceEventType.Error, 4, "Error message."); mySource.TraceInformation("Informational message."); } } }