Freigeben über


TraceSource Klasse

Definition

Stellt eine Reihe von Methoden und Eigenschaften bereit, mit denen Anwendungen die Ausführung von Code nachverfolgen und Ablaufverfolgungsmeldungen ihrer Quelle zuordnen können.

public ref class TraceSource
public class TraceSource
type TraceSource = class
Public Class TraceSource
Vererbung
TraceSource

Beispiele

Das folgende Codebeispiel zeigt die Verwendung der TraceSource Klasse zum Weiterleiten von Ablaufverfolgungen an Listener. Im Beispiel wird auch die Switch- und Filterverwendung veranschaulicht.

// The following configuration file can be used with this sample.
// When using a configuration file #define ConfigFile.
//            <source name="TraceTest" switchName="SourceSwitch" switchType="System.Diagnostics.SourceSwitch" >
//                    <add name="console" type="System.Diagnostics.ConsoleTraceListener" initializeData="false" />
//                    <remove name ="Default" />
//            <!-- 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" -->
//        <trace autoflush="true" indentsize="4"></trace>
#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");
                ts.Switch = sourceSwitch;
                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("TraceSource name = " + ts.Name);
            Console.WriteLine("TraceSource switch level = " + ts.Switch.Level);
            Console.WriteLine("TraceSource switch = " + ts.Switch.DisplayName);
            SwitchAttribute[] switches = SwitchAttribute.GetAll(typeof(TraceTest).Assembly);
            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));
            }
        }
    }
}
' The following configuration file can be used with this sample.
' When using a configuration file #define ConfigFile.
'            <source name="TraceTest" switchName="SourceSwitch" switchType="System.Diagnostics.SourceSwitch" >
'                    <add name="console" type="System.Diagnostics.ConsoleTraceListener" initializeData="false" />
'                    <remove name ="Default" />
'            <!-- 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" -->
'        <trace autoflush="true" indentsize="4"></trace>
#Const TRACE = True
'#Const ConfigFile = True

Imports System.Collections
Imports System.Diagnostics
Imports System.Reflection
Imports System.IO
Imports System.Security.Permissions



Class TraceTest
    ' Initialize the trace source.
    Private Shared ts As New TraceSource("TraceTest")
    <SwitchAttribute("SourceSwitch", GetType(SourceSwitch))> _
    Shared Sub Main()
        Try
            ' Initialize trace switches.
#If (ConfigFile = False) Then
            Dim sourceSwitch As New SourceSwitch("SourceSwitch", "Verbose")
            ts.Switch = sourceSwitch
            Dim idxConsole As New Integer()
            idxConsole = ts.Listeners.Add(New System.Diagnostics.ConsoleTraceListener())
            ts.Listeners(idxConsole).Name = "console"
#End If
            DisplayProperties(ts)
            ts.Listeners("console").TraceOutputOptions = ts.Listeners("console").TraceOutputOptions Or 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 = ts.Listeners("console").TraceOutputOptions Or 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 = Nothing
            ' 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 Or 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 e As Exception
            ' Catch any unexpected exception.
            Console.WriteLine("Unexpected exception: " + e.ToString())
            Console.Read()
        End Try

    End Sub

    Public Shared Sub DisplayProperties(ByVal ts As TraceSource)
        Console.WriteLine("TraceSource name = " + ts.Name)
        Console.WriteLine("TraceSource switch level = " + ts.Switch.Level.ToString())
        Console.WriteLine("TraceSource switch = " + ts.Switch.DisplayName.ToString())
        Dim switches As SwitchAttribute() = SwitchAttribute.GetAll(GetType(TraceTest).Assembly)
        Dim i As Integer
        For i = 0 To switches.Length - 1
            Console.WriteLine("Switch name = " + switches(i).SwitchName.ToString())
            Console.WriteLine("Switch type = " + switches(i).SwitchType.ToString())
        Next i

#If (ConfigFile) Then
        ' Get the custom attributes for the TraceSource.
        Console.WriteLine("Number of custom trace source attributes = " + ts.Attributes.Count)
        Dim de As DictionaryEntry
        For Each de In ts.Attributes
            Console.WriteLine("Custom trace source attribute = " + de.Key + "  " + de.Value)
        Next de
        ' Get the custom attributes for the trace source switch.
        For Each de In ts.Switch.Attributes
            Console.WriteLine("Custom switch attribute = " + de.Key + "  " + de.Value)
        Next de
#End If
        Console.WriteLine("Number of listeners = " + ts.Listeners.Count.ToString())
        Dim traceListener As TraceListener
        For Each traceListener In ts.Listeners
            Console.Write("TraceListener: " + traceListener.Name + vbTab)
            ' The following output can be used to update the configuration file.
            Console.WriteLine("AssemblyQualifiedName = " + traceListener.GetType().AssemblyQualifiedName)
        Next traceListener

    End Sub
End Class

Hinweise

Anwendungen verwenden die TraceSource Klasse, um Protokolle zu erzeugen, die mit der Anwendung verknüpft werden können. TraceSource bietet Tracing-Methoden, mit denen Sie Ereignisse, Tracedaten und Informationstraces einfach verfolgen können.

In .NET Framework-Apps kann die Ablaufverfolgungsausgabe TraceSource durch Konfigurationsdateieinstellungen gesteuert werden. Die Konfigurationsdatei befindet sich im Ordner mit der ausführbaren Anwendung und weist den Namen der Anwendung auf, wobei die .config Erweiterung hinzugefügt wurde. Beispielsweise ist der Name der Konfigurationsdatei für TraceSourceSample.exe TraceSourceSample.exe.config. Die Konfigurationsdatei kann verwendet werden, um anzugeben, wo die Ablaufverfolgungsinformationen gesendet werden sollen und welche Aktivitätsebenen nachverfolgt werden sollen. Das folgende Beispiel zeigt den Inhalt einer .NET Framework-Beispielanwendungskonfigurationsdatei.

<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 identifiziert, in der Regel der Name der Anwendung. Die Ablaufverfolgungsmeldungen, die von einer bestimmten Komponente stammen, können von einer bestimmten Ablaufverfolgungsquelle initiiert werden, sodass alle Nachrichten, die von dieser Komponente stammen, leicht identifiziert werden können.

TraceSource definiert Ablaufverfolgungsmethoden, bietet jedoch keinen spezifischen Mechanismus zum Generieren und Speichern von Ablaufverfolgungsdaten. Die Ablaufverfolgungsdaten werden von Ablaufverfolgungslistenern erstellt, die Plug-Ins sind, die von Ablaufverfolgungsquellen geladen werden können.

Hinweis

Sie sollten die Ablaufverfolgungsmethoden während der Fertigstellung nicht aufrufen. Dies kann dazu führen, dass ein ObjectDisposedException Wurf ausgelöst wird.

Sie können das Ziel der Ablaufverfolgungsausgabe anpassen, indem Sie Instanzen zu oder aus der auflistung hinzufügen oder entfernen TraceListener , die in der TraceSource.Listeners Eigenschaft gespeichert ist. Standardmäßig wird die Ablaufverfolgungsausgabe mithilfe einer Instanz der DefaultTraceListener Klasse erstellt.

Im vorherigen Beispiel für die .NET Framework-App-Konfigurationsdatei wird das Entfernen DefaultTraceListener und Hinzufügen einer ConsoleTraceListener Datei veranschaulicht, um die Ablaufverfolgungsausgabe für die Ablaufverfolgungsquelle zu erzeugen. Weitere Informationen finden Sie unter <Listener> und <sharedListeners>.

Hinweis

Das Hinzufügen eines Ablaufverfolgungs-Listeners zur Auflistung kann dazu führen, dass während der Listeners Ablaufverfolgung eine Ausnahme ausgelöst wird, wenn eine ressource, die vom Ablaufverfolgungslistener verwendet wird, nicht verfügbar ist. Die Bedingungen und die ausgelöste Ausnahme hängen vom Ablaufverfolgungslistener ab und können in diesem Thema nicht aufgezählt werden. Es kann hilfreich sein, Aufrufe an die TraceSource Methoden in try/catch Blöcken zu platzieren, um Ausnahmen von Ablaufverfolgungslistenern zu erkennen und zu verarbeiten.

Die SourceSwitch Klasse bietet die Möglichkeit, die Ablaufverfolgungsausgabe dynamisch zu steuern. In .NET Framework-Apps wird im vorherigen Konfigurationsdateibeispiel gezeigt, wie Sie die Ablaufverfolgung aus einer Ablaufverfolgungsquelle deaktivieren und die Ebene steuern können, auf der die Ablaufverfolgung erfolgt. Sie können den Wert des Quellswitches ändern, ohne die Anwendung neu zu kompilieren. Informationen zur Verwendung der Konfigurationsdatei zum Festlegen eines Switches finden Sie unter Switch " Erstellen, Initialisieren und Konfigurieren von Ablaufverfolgungsschaltern".

Hinweis

Wenn Sie eine Konfigurationsdatei ändern, während eine Anwendung ausgeführt wird, muss die Anwendung beendet und neu gestartet werden, oder die Refresh Methode muss aufgerufen werden, bevor die neuen Einstellungen wirksam werden.

Die TraceEventType Aufzählung wird verwendet, um den Ereignistyp der Ablaufverfolgungsnachricht zu definieren. Mithilfe von TraceEventType Ablaufverfolgungsfiltern können Sie ermitteln, ob ein Ablaufverfolgungslistener die Ablaufverfolgungsmeldung erzeugen soll.

Die Ablaufverfolgungslistener können optional über eine zusätzliche Filterebene durch einen Ablaufverfolgungsfilter verfügen. Wenn ein Ablaufverfolgungslistener über einen zugeordneten Filter verfügt, ruft der Listener die ShouldTrace Methode für diesen Filter auf, um festzustellen, ob die Ablaufverfolgungsinformationen erzeugt werden sollen.

Die Ablaufverfolgungslistener verwenden die Werte der Trace Klasseneigenschaften Indent, IndentSizeund AutoFlush formatieren die Ablaufverfolgungsausgabe. In .NET Framework-Apps können Sie Konfigurationsdateiattribute verwenden, um die IndentEigenschaften IndentSizeund AutoFlush Eigenschaften 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>

Konstruktoren

Name Beschreibung
TraceSource(String, SourceLevels)

Initialisiert eine neue Instanz der TraceSource Klasse, wobei der angegebene Name für die Quelle und die Standardquellebene verwendet wird, auf der die Ablaufverfolgung erfolgen soll.

TraceSource(String)

Initialisiert eine neue Instanz der TraceSource Klasse, wobei der angegebene Name für die Quelle verwendet wird.

Eigenschaften

Name Beschreibung
Attributes

Ruft die in der Anwendungskonfigurationsdatei definierten benutzerdefinierten Switchattribute ab.

DefaultLevel

Ruft die Im Konstruktor zugewiesene Standardebene ab.

Listeners

Ruft die Auflistung der Ablaufverfolgungslistener für die Ablaufverfolgungsquelle ab.

Name

Ruft den Namen der Ablaufverfolgungsquelle ab.

Switch

Dient zum Abrufen oder Festlegen des Quellwechselwerts.

Methoden

Name Beschreibung
Close()

Schließt alle Ablaufverfolgungslistener in der Ablaufverfolgungslistenersammlung.

Equals(Object)

Bestimmt, ob das angegebene Objekt dem aktuellen Objekt entspricht.

(Geerbt von Object)
Flush()

Löscht alle Ablaufverfolgungslistener in der Ablaufverfolgungslistenersammlung.

GetHashCode()

Dient als Standardhashfunktion.

(Geerbt von Object)
GetSupportedAttributes()

Ruft die benutzerdefinierten Attribute ab, die von der Ablaufverfolgungsquelle unterstützt werden.

GetType()

Ruft die Type der aktuellen Instanz ab.

(Geerbt von Object)
MemberwiseClone()

Erstellt eine flache Kopie der aktuellen Object.

(Geerbt von Object)
ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

(Geerbt von Object)
TraceData(TraceEventType, Int32, Object)

Schreibt Ablaufverfolgungsdaten mithilfe des angegebenen Ereignistyps, des Ereignisbezeichners und der Ablaufverfolgungsdaten in die Ablaufverfolgungslistener in die Listeners Auflistung.

TraceData(TraceEventType, Int32, Object[])

Schreibt Ablaufverfolgungsdaten mithilfe des angegebenen Ereignistyps, des Ereignisbezeichners und des Ablaufverfolgungsdatenarrays in die Ablaufverfolgungslistener in die Listeners Auflistung.

TraceEvent(TraceEventType, Int32, String, Object[])

Schreibt ein Ablaufverfolgungsereignis in die Ablaufverfolgungslistener in der Listeners Auflistung mithilfe des angegebenen Ereignistyps, des Ereignisbezeichners und des Argumentarrays und -formats.

TraceEvent(TraceEventType, Int32, String)

Schreibt eine Ablaufverfolgungsereignisnachricht in die Ablaufverfolgungslistener in der Listeners Auflistung mithilfe des angegebenen Ereignistyps, des Ereignisbezeichners und der Nachricht.

TraceEvent(TraceEventType, Int32)

Schreibt eine Ablaufverfolgungsereignisnachricht in die Ablaufverfolgungslistener in der Listeners Auflistung mithilfe des angegebenen Ereignistyps und ereignisbezeichners.

TraceInformation(String, Object[])

Schreibt eine Informationsmeldung in die Ablaufverfolgungslistener in der Listeners Auflistung mithilfe der angegebenen Objektarray- und Formatierungsinformationen.

TraceInformation(String)

Schreibt eine Informationsmeldung in die Ablaufverfolgungslistener in der Listeners Auflistung mithilfe der angegebenen Nachricht.

TraceTransfer(Int32, String, Guid)

Schreibt eine Ablaufverfolgungsübertragungsnachricht in die Ablaufverfolgungslistener in der Listeners Auflistung mithilfe des angegebenen numerischen Bezeichners, der Nachricht und des zugehörigen Aktivitätsbezeichners.

Ereignisse

Name Beschreibung
Initializing

Tritt auf, wenn eine TraceSource Initialisierung erforderlich ist.

Gilt für:

Threadsicherheit

Dieser Typ ist threadsicher.

Weitere Informationen