Procedure: Traceringsbronnen maken en initialiseren
Notitie
Dit artikel is specifiek voor .NET Framework. Dit geldt niet voor nieuwere implementaties van .NET, waaronder .NET 6 en nieuwere versies.
De TraceSource klasse wordt gebruikt door toepassingen om traceringen te produceren die aan de toepassing kunnen worden gekoppeld. TraceSource biedt traceringsmethoden waarmee u eenvoudig gebeurtenissen, traceringsgegevens en informatieve traceringen kunt traceren. Traceringsuitvoer kan TraceSource worden gemaakt en geïnitialiseerd met of zonder het gebruik van configuratiebestanden. Dit onderwerp bevat instructies voor beide opties. We raden u echter aan om configuratiebestanden te gebruiken om de herconfiguratie van de traceringen die tijdens runtime door traceringsbronnen worden geproduceerd, te vergemakkelijken.
Een traceringsbron maken en initialiseren met behulp van een configuratiebestand
Maak een Visual Studio-consoletoepassingsproject (.NET Framework) en vervang de opgegeven code door de volgende code. Deze code registreert fouten en waarschuwingen en voert enkele hiervan uit naar de console, en sommige ervan naar het myListener-bestand dat is gemaakt door de vermeldingen in het configuratiebestand.
using System; using System.Diagnostics; class TraceTest { private static TraceSource mySource = new TraceSource("TraceSourceApp"); static void Main(string[] args) { // Issue an error and a warning message. Only the error message // should be logged. Activity1(); // Save the original settings from the configuration file. EventTypeFilter configFilter = (EventTypeFilter)mySource.Listeners["console"].Filter; // Create a new event type filter that ensures // warning messages will be written. mySource.Listeners["console"].Filter = new EventTypeFilter(SourceLevels.Warning); // Allow the trace source to send messages to listeners // for all event types. This statement will override // any settings in the configuration file. // If you do not change the switch level, the event filter // changes have no effect. mySource.Switch.Level = SourceLevels.All; // Issue a warning and a critical message. Both should be logged. Activity2(); // 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.TraceEvent(TraceEventType.Warning, 2, "Warning message."); } static void Activity3() { mySource.TraceEvent(TraceEventType.Error, 4, "Error message."); mySource.TraceInformation("Informational message."); } }
Imports System.Diagnostics Class TraceTest Private Shared mySource As New TraceSource("TraceSourceApp") Shared Sub Main(ByVal args() As String) ' Issue an error and a warning message. Only the error message ' should be logged. Activity1() ' Save the original settings from the configuration file. Dim configFilter As EventTypeFilter = CType(mySource.Listeners("console").Filter, EventTypeFilter) ' Create a new event type filter that ensures ' warning messages will be written. mySource.Listeners("console").Filter = New EventTypeFilter(SourceLevels.Warning) ' Allow the trace source to send messages to listeners ' for all event types. This statement will override ' any settings in the configuration file. ' If you do not change the switch level, the event filter ' changes have no effect. mySource.Switch.Level = SourceLevels.All ' Issue a warning and a critical message. Both should be logged. Activity2() ' Restore the original filter settings. mySource.Listeners("console").Filter = configFilter Activity3() mySource.Close() Return End Sub Shared Sub Activity1() mySource.TraceEvent(TraceEventType.Error, 1, "Error message.") mySource.TraceEvent(TraceEventType.Warning, 2, "Warning message.") End Sub Shared Sub Activity2() mySource.TraceEvent(TraceEventType.Critical, 3, "Critical message.") mySource.TraceEvent(TraceEventType.Warning, 2, "Warning message.") End Sub Shared Sub Activity3() mySource.TraceEvent(TraceEventType.Error, 4, "Error message.") mySource.TraceInformation("Informational message.") End Sub End Class
Voeg in stap 1 een toepassingsconfiguratiebestand toe aan het project om de traceringsbron met de naam
TraceSourceApp
in het codevoorbeeld te initialiseren.Vervang de standaardinhoud van het configuratiebestand door de volgende instellingen om een consoletraceringslistener en een tekstschrijver-listener te initialiseren voor de traceringsbron die in stap 1 is gemaakt.
<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="Error"/> </add> <add name="myListener"/> <remove name="Default"/> </listeners> </source> </sources> <switches> <add name="sourceSwitch" value="Error"/> </switches> <sharedListeners> <add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="myListener.log"> <filter type="System.Diagnostics.EventTypeFilter" initializeData="Error"/> </add> </sharedListeners> </system.diagnostics> </configuration>
Naast het configureren van de traceerlisteners, maakt het configuratiebestand filters voor beide listeners en maakt het een bronswitch voor de traceringsbron. Er worden twee technieken weergegeven voor het toevoegen van traceerlisteners: de listener rechtstreeks toevoegen aan de traceringsbron en een listener toevoegen aan de verzameling gedeelde listeners en deze vervolgens op naam toevoegen aan de traceringsbron. De filters die voor de twee listeners worden geïdentificeerd, worden geïnitialiseerd met verschillende bronniveaus. Dit resulteert in een aantal berichten die slechts door een van de twee listeners worden geschreven.
Het configuratiebestand initialiseert de instellingen voor de traceringsbron op het moment dat de toepassing wordt geïnitialiseerd. De toepassing kan de eigenschappen die door het configuratiebestand zijn ingesteld, dynamisch wijzigen om instellingen te overschrijven die door de gebruiker zijn opgegeven. U wilt er bijvoorbeeld voor zorgen dat kritieke berichten altijd naar een tekstbestand worden verzonden, ongeacht de huidige configuratie-instellingen. De voorbeeldcode laat zien hoe u de configuratiebestandsinstellingen overschrijft om ervoor te zorgen dat kritieke berichten worden uitgevoerd voor de traceringslisteners.
Als u de instellingen van het configuratiebestand wijzigt terwijl de toepassing wordt uitgevoerd, worden de initiële instellingen niet gewijzigd. Als u de instellingen wilt wijzigen, moet u de toepassing opnieuw starten of de toepassing programmatisch vernieuwen met behulp van de Trace.Refresh methode.
Traceringsbronnen, listeners en filters initialiseren zonder een configuratiebestand
Gebruik de volgende voorbeeldcode om tracering via een traceringsbron in te schakelen zonder een configuratiebestand te gebruiken. Dit is geen aanbevolen procedure, maar er kunnen omstandigheden zijn waarin u niet afhankelijk wilt zijn van configuratiebestanden om tracering te garanderen.
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(); // Allow the trace source to send messages to // listeners for all event types. Currently only // error messages or higher go to the listeners. // Messages must get past the source switch to // get to the listeners, regardless of the settings // for the listeners. mySource.Switch.Level = SourceLevels.All; // Set the filter settings for the // console trace listener. mySource.Listeners["console"].Filter = new EventTypeFilter(SourceLevels.Critical); Activity2(); // 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."); } } }
Imports System.Diagnostics Imports System.Threading Class Program Private Shared mySource As New TraceSource("TraceSourceApp") Shared Sub Main(ByVal args() As String) mySource.Switch = New SourceSwitch("sourceSwitch", "Error") mySource.Listeners.Remove("Default") Dim textListener As New TextWriterTraceListener("myListener.log") Dim console As 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() ' Allow the trace source to send messages to ' listeners for all event types. Currently only ' error messages or higher go to the listeners. ' Messages must get past the source switch to ' get to the listeners, regardless of the settings ' for the listeners. mySource.Switch.Level = SourceLevels.All ' Set the filter settings for the ' console trace listener. mySource.Listeners("console").Filter = New EventTypeFilter(SourceLevels.Critical) Activity2() ' Change the filter settings for the console trace listener. mySource.Listeners("console").Filter = New EventTypeFilter(SourceLevels.Information) Activity3() mySource.Close() Return End Sub Shared Sub Activity1() mySource.TraceEvent(TraceEventType.Error, 1, "Error message.") mySource.TraceEvent(TraceEventType.Warning, 2, "Warning message.") End Sub Shared Sub Activity2() mySource.TraceEvent(TraceEventType.Critical, 3, "Critical message.") mySource.TraceInformation("Informational message.") End Sub Shared Sub Activity3() mySource.TraceEvent(TraceEventType.Error, 4, "Error message.") mySource.TraceInformation("Informational message.") End Sub End Class