TraceSource-Klasse
Assembly: System (in system.dll)
Die TraceSource-Klasse wird von Anwendungen verwendet, um Ablaufverfolgungen zu erstellen, die der Anwendung zugeordnet werden können. TraceSource stellt Ablaufverfolgungsmethoden bereit, mit denen Sie Ereignisse und Daten einfach verfolgen und Ablaufverfolgungen zu Informationszwecken ausgeben können. Die Ablaufverfolgungsausgabe von TraceSource kann durch Einstellungen der Konfigurationsdatei gesteuert werden. Die Konfigurationsdatei befindet sich in dem Ordner mit der ausführbaren Datei der Anwendung und hat den Namen der Anwendung mit der Dateinamenerweiterung .config. Der Name der Konfigurationsdatei für TraceSourceSample.exe lautet beispielsweise TraceSourceSample.exe.config. Die Konfigurationsdatei kann verwendet werden, um zu bestimmen, ob die Ablaufverfolgungsinformationen gesendet werden und welche Aktivitätsebenen verfolgt werden sollen. Im folgenden Beispiel wird der Inhalt einer Beispielkonfigurationsdatei einer Anwendung veranschaulicht.
<configuration>
<system.diagnostics>
<sources>
<source name="TraceTest" switchName="SourceSwitch"
switchType="System.Diagnostics.SourceSwitch" >
<listeners>
<add name="console" />
<remove name ="Default" />
</listeners>
</source>
</sources>
<switches>
<!-- You can set the level at which tracing is to occur -->
<add name="SourceSwitch" value="Warning" />
<!-- You can turn tracing off -->
<!--add name="SourceSwitch" value="Off" -->
</switches>
<sharedListeners>
<add name="console"
type="System.Diagnostics.ConsoleTraceListener"
initializeData="false"/>
</sharedListeners>
<trace autoflush="true" indentsize="4">
<listeners>
<add name="console" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
Die TraceSource-Klasse wird durch den Namen einer Quelle bezeichnet, i. d. R. dem Namen der Anwendung. Die Ablaufverfolgungsmeldungen einer bestimmten Komponente können von einer bestimmten Ablaufverfolgungsquelle initiiert werden, sodass alle Meldung der betreffenden Komponente einfach identifiziert werden können.
TraceSource definiert Ablaufverfolgungsmethoden, stellt aber keinen bestimmten Mechanismus für das Generieren und Speichern von Ablaufverfolgungsdaten bereit. Die Ablaufverfolgungsdaten werden von Ablaufverfolgungslistenern erzeugt, bei denen es sich um Plug-Ins handelt, die von Ablaufverfolgungsquellen geladen werden können.
Sie können das Ziel der Ausgabe der Ablaufverfolgung anpassen, indem Sie in der in der TraceListener-Eigenschaft gespeicherten Auflistung TraceSource.Listeners-Instanzen hinzufügen oder aus dieser entfernen. In der Standardeinstellung wird die Ablaufverfolgungsausgabe mit einer Instanz der DefaultTraceListener-Klasse erzeugt. Im vorigen Beispiel für eine Konfigurationsdatei wird veranschaulicht, wie der DefaultTraceListener entfernt und ein ConsoleTraceListener hinzugefügt wird, um die Ablaufverfolgungsausgabe für die Ablaufverfolgungsquelle zu erzeugen. Weitere Informationen finden Sie unter <listeners>-Element für <source> und <sharedListeners>-Element.
Mit der SourceSwitch-Klasse kann die Ausgabe der Ablaufverfolgung dynamisch gesteuert werden. Im vorangegangenen Beispiel für eine Konfigurationsdatei wird veranschaulicht, wie Sie die Ablaufverfolgung einer Ablaufverfolgungsquelle deaktivieren und die Ebene steuern können, auf der die Ablaufverfolgung stattfindet. Sie können den Wert des Quellschalters ändern, ohne die Anwendung erneut zu kompilieren. Weitere Informationen über das Verwenden der Konfigurationsdatei zum Festlegen eines Schalters finden Sie unter Switch und Gewusst wie: Konfigurieren von Ablaufverfolgungsschaltern.
Hinweis: |
|---|
| Wenn Sie eine Konfigurationsdatei während der Ausführung einer Anwendung ändern, muss die Anwendung angehalten und erneut gestartet oder die Refresh-Methode aufgerufen werden, bevor die neuen Einstellungen wirksam werden. |
Die TraceEventType-Enumeration wird verwendet, um den Ereignistyp der Ablaufverfolgungsmeldung zu definieren. Ablaufverfolgungsfilter verwenden den TraceEventType, um zu bestimmen, ob ein Ablaufverfolgungslistener die Ablaufverfolgungsmeldung erzeugen soll.
Die Ablaufverfolgungslistener können über einen Ablaufverfolgungsfilter optional eine zusätzliche Filterebene aufweisen. Wenn einem Ablaufverfolgungslistener ein Filter zugeordnet ist, ruft der Listener die ShouldTrace-Methode für diesen Filter auf, um zu bestimmen, ob die Ablaufverfolgungsinformationen erzeugt werden sollen.
Die Ablaufverfolgungslistener verwenden die Werte der Indent-Eigenschaft, der IndentSize-Eigenschaft und der AutoFlush-Eigenschaft der Trace-Klasse, um die Ablaufverfolgungsausgabe zu formatieren. Sie können Konfigurationsdateiattribute verwenden, um die Indent-Eigenschaft, die IndentSize-Eigenschaft und die AutoFlush-Eigenschaft festzulegen. Im folgenden Beispiel wird die AutoFlush-Eigenschaft auf false und die IndentSize-Eigenschaft auf 3 festgelegt.
<configuration>
<system.diagnostics>
<trace autoflush="false" indentsize="3" />
</system.diagnostics>
</configuration>
| Thema | Position |
|---|---|
| Gewusst wie: Verwenden von TraceSource und Filtern für Ablaufverfolgungslistener | .NET Framework: Debuggen |
| Gewusst wie: Verwenden von TraceSource und Filtern für Ablaufverfolgungslistener | .NET Framework: Debuggen |
Im folgenden Codebeispiel wird die Verwendung der TraceSource-Klasse zum Weiterleiten von Ablaufverfolgungen an Listener veranschaulicht. In dem Beispiel wird außerdem die Verwendung von Schaltern und Filtern veranschaulicht.
// The following configuration file can be used with this sample. // When using a configuration file #define ConfigFile. //<configuration> // <system.diagnostics> // <sources> // <source name="TraceTest" switchName="SourceSwitch" switchType="System.Diagnostics.SourceSwitch" > // <listeners> // <add name="console" type="System.Diagnostics.ConsoleTraceListener" initializeData="false" /> // <remove name ="Default" /> // </listeners> // </source> // </sources> // <switches> // <!-- You can set the level at which tracing is to occur --> // <add name="SourceSwitch" value="Warning" /> // <!-- You can turn tracing off --> // <!--add name="SourceSwitch" value="Off" --> // </switches> // <trace autoflush="true" indentsize="4"></trace> // </system.diagnostics> //</configuration> #define TRACE //#define ConfigFile using System; using System.Collections; using System.Diagnostics; using System.Reflection; using System.IO; using System.Security.Permissions; namespace Testing { class TraceTest { // Initialize the trace source. static TraceSource ts = new TraceSource("TraceTest"); [SwitchAttribute("SourceSwitch", typeof(SourceSwitch))] static void Main() { try { // Initialize trace switches. #if(!ConfigFile) SourceSwitch sourceSwitch = new SourceSwitch("SourceSwitch", "Verbose"); int idxConsole = ts.Listeners.Add(new System.Diagnostics.ConsoleTraceListener()); ts.Listeners[idxConsole].Name = "console"; #endif DisplayProperties(ts); ts.Listeners["console"].TraceOutputOptions |= TraceOptions.Callstack; ts.TraceEvent(TraceEventType.Warning, 1); ts.Listeners["console"].TraceOutputOptions = TraceOptions.DateTime; // Issue file not found message as a warning. ts.TraceEvent(TraceEventType.Warning, 2, "File Test not found"); // Issue file not found message as a verbose event using a formatted string. ts.TraceEvent(TraceEventType.Verbose, 3, "File {0} not found.", "test"); // Issue file not found message as information. ts.TraceInformation("File {0} not found.", "test"); ts.Listeners["console"].TraceOutputOptions |= TraceOptions.LogicalOperationStack; // Issue file not found message as an error event. ts.TraceEvent(TraceEventType.Error, 4, "File {0} not found.", "test"); // Test the filter on the ConsoleTraceListener. ts.Listeners["console"].Filter = new SourceFilter("No match"); ts.TraceData(TraceEventType.Error, 5, "SourceFilter should reject this message for the console trace listener."); ts.Listeners["console"].Filter = new SourceFilter("TraceTest"); ts.TraceData(TraceEventType.Error, 6, "SourceFilter should let this message through on the console trace listener."); ts.Listeners["console"].Filter = null; // Use the TraceData method. ts.TraceData(TraceEventType.Warning, 7, new object()); ts.TraceData(TraceEventType.Warning, 8, new object[] { "Message 1", "Message 2" }); // Activity tests. ts.TraceEvent(TraceEventType.Start, 9, "Will not appear until the switch is changed."); ts.Switch.Level = SourceLevels.ActivityTracing | SourceLevels.Critical; ts.TraceEvent(TraceEventType.Suspend, 10, "Switch includes ActivityTracing, this should appear"); ts.TraceEvent(TraceEventType.Critical, 11, "Switch includes Critical, this should appear"); ts.Flush(); ts.Close(); Console.WriteLine("Press any key to exit."); Console.Read(); } catch (Exception e) { // Catch any unexpected exception. Console.WriteLine("Unexpected exception: " + e.ToString()); Console.Read(); } } public static void DisplayProperties(TraceSource ts) { Console.WriteLine("SourceSwitch name = " + ts.Name); Console.WriteLine("TraceSource switch level = " + ts.Switch.Level); Console.WriteLine("TraceSource switch = " + ts.Switch.DisplayName); SwitchAttribute[] switches = SwitchAttribute.GetAll(Assembly.GetExecutingAssembly()); for (int i = 0; i < switches.Length; i++) { Console.WriteLine("Switch name = " + switches[i].SwitchName); Console.WriteLine("Switch type = " + switches[i].SwitchType); } #if(ConfigFile) // Get the custom attributes for the TraceSource. Console.WriteLine("Number of custom trace source attributes = " + ts.Attributes.Count); foreach (DictionaryEntry de in ts.Attributes) Console.WriteLine("Custom trace source attribute = " + de.Key + " " + de.Value); // Get the custom attributes for the trace source switch. foreach (DictionaryEntry de in ts.Switch.Attributes) Console.WriteLine("Custom switch attribute = " + de.Key + " " + de.Value); #endif Console.WriteLine("Number of listeners = " + ts.Listeners.Count); foreach (TraceListener traceListener in ts.Listeners) { Console.Write("TraceListener: " + traceListener.Name + "\t"); // The following output can be used to update the configuration file. Console.WriteLine("AssemblyQualifiedName = " + (traceListener.GetType().AssemblyQualifiedName)); } } } }
Windows 98, Windows Server 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
Microsoft .NET Framework 3.0 wird unter Windows Vista, Microsoft Windows XP SP2 und Windows Server 2003 SP1 unterstützt.
Hinweis: