Procedura: utilizzare TraceSource e filtri con listener di analisi
Aggiornamento: novembre 2007
In .NET Framework versione 2.0 è stato introdotto un sistema di analisi avanzato. Il principio di base è rimasto invariato: i messaggi di analisi vengono inviati tramite oggetti di commutazione ai listener, i quali trasmettono i dati a un supporto di output associato. Una delle principali differenze della versione 2.0 consiste nel fatto che le analisi possono essere avviate mediante istanze della classe TraceSource. Questa classe funziona come un sistema di analisi avanzato e può essere utilizzata al posto dei metodi statici delle classi di analisi Trace e Debug delle versioni precedenti. Sebbene le classi Trace e Debug siano ancora disponibili, per l'analisi si consiglia di utilizzare la classe TraceSource.
In questa sezione viene descritto come utilizzare una classe TraceSource insieme a un file di configurazione dell'applicazione. Sebbene non sia consigliato, è possibile eseguire l'analisi utilizzando una classe TraceSource senza un file di configurazione. Per informazioni su come eseguire l'analisi senza utilizzare un file di configurazione, vedere Procedura: creare e inizializzare origini di analisi.
Per creare e inizializzare l'origine di analisi
Il primo passo per la strumentazione di un'applicazione con il sistema di analisi consiste nel creare un'origine di analisi. Nei progetti di grandi dimensioni in cui sono presenti diversi componenti è possibile creare un'origine di analisi distinta per ciascun componente. Si consiglia di assegnare all'origine di analisi il nome dell'applicazione. In questo modo sarà più semplice mantenere separate le diverse analisi. Nel codice riportato di seguito viene creata una nuova origine di analisi (mySource) e viene chiamato un metodo (Activity1) che analizza gli eventi. I messaggi di analisi vengono scritti dal listener di analisi predefinito.
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(); mySource.Close(); return; } static void Activity1() { mySource.TraceEvent(TraceEventType.Error, 1, "Error message."); mySource.TraceEvent(TraceEventType.Warning, 2, "Warning message."); } } }
Per creare e inizializzare i listener di analisi e i filtri
Il codice riportato nella prima procedura non consente di identificare a livello di codice eventuali listener di analisi o filtri. Nei messaggi di analisi scritti nel listener di analisi predefinito è riportato soltanto il codice. Per configurare listener di analisi specifici e i relativi filtri associati, modificare il file di configurazione corrispondente al nome dell'applicazione. In questo file è possibile aggiungere o rimuovere un listener, impostare le proprietà e un filtro per un listener oppure rimuovere i listener. Nell'esempio di file di configurazione riportato di seguito viene illustrato come inizializzare un listener di analisi console e un listener di analisi writer di testo per l'origine di analisi creata nella procedura precedente. Oltre alla configurazione dei listener di analisi, il file di configurazione crea filtri per entrambi i listener nonché un oggetto sourceSwitch per l'origine di analisi. Per l'aggiunta dei listener di analisi sono illustrate due tecniche: aggiunta del listener direttamente nell'origine di analisi e aggiunta di un listener all'insieme dei listener condivisi e quindi aggiunta di quest'ultimo in base al nome all'origine di analisi. I filtri identificati per i due listener vengono inizializzati con livelli di origine differenti. Di conseguenza, alcuni messaggi vengono scritti da uno solo dei due listener.
<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>
Per modificare il livello in cui un listener scrive un messaggio di analisi
Il file di configurazione inizializza le impostazioni dell'origine di analisi nel momento in cui l'applicazione viene inizializzata. Per modificare queste impostazioni è necessario modificare il file di configurazione e riavviare l'applicazione oppure aggiornare l'applicazione a livello di codice utilizzando il metodo Trace.Refresh. L'applicazione può modificare dinamicamente le proprietà impostate dal file di configurazione per eseguire l'override delle eventuali impostazioni specificate dall'utente. È possibile, ad esempio, assicurare che i messaggi critici vengano sempre inviati a un file di testo, indipendentemente dalle impostazioni di configurazione correnti.
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."); } } }
Vedere anche
Attività
Procedura: creare e inizializzare origini di analisi