EventSchemaTraceListener 类   
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
将端对端事件的跟踪或调试输出定向到 XML 编码的符合架构的日志文件。
public ref class EventSchemaTraceListener : System::Diagnostics::TextWriterTraceListenerpublic class EventSchemaTraceListener : System.Diagnostics.TextWriterTraceListenertype EventSchemaTraceListener = class
    inherit TextWriterTraceListenerPublic Class EventSchemaTraceListener
Inherits TextWriterTraceListener- 继承
示例
下面的代码示例演示如何使用 EventSchemaTraceListener 类。
///////////////////////////////////////////////////////////////////////
//
// EventSchemaTraceListener.cpp : main project file.
// Expected Output:
// 1)
//      EventSchemaTraceListener CPP Sample
//
//      IsThreadSafe? True
//      BufferSize =  65536
//      MaximumFileSize =  20480000
//      MaximumNumberOfFiles =  2
//      Name =  eventListener
//      TraceLogRetentionOption = LimitedCircularFiles
//      TraceOutputOptions = DateTime, Timestamp, ProcessId
//
//      Press the enter key to exit
//
// 2) An output file is created named TraceOutput.xml.  It will be
//    opened and displayed in Microsoft Notepad.
//
// NOTE 1:
//  Under certain circumstances, the VS C++ compiler will treat
//          Console::WriteLine("MyText = " + MyVar);
//        differently then the VS CSharp compiler.
//        The C++ compiler will produce error C3063, whereas the 
//        CSharp compiler accepts the statement.
//        This occurs when the VS C++ compiler cannot determine the
//        datatype of "MyVar" because it is an enumeration type.
//        The solution is:
//        Use either of the following two methods:
//          Console::WriteLine("MyText = {0} " , MyVar);
//          Console::WriteLine("MyText =  " + MyVar.ToString());
//
//        Although not specific to this particular pieces of code,
//        this is demonstrated below in the Display function:  The
//        last two members, TraceLogRetentionOption, and
//        TraceOutputOptions, are enumerations, and cannot simply be
//        concatenated into Console::WriteLine.
//
///////////////////////////////////////////////////////////////////////
#using <System.dll>
#using <System.Core.dll>
#define NOCONFIGFILE 1
using namespace System;
using namespace System::IO;
using namespace System::Diagnostics;
[STAThreadAttribute]
void main()
{
    Console::WriteLine("EventSchemaTraceListener CPP Sample\n");
    File::Delete("TraceOutput.xml");
    TraceSource ^ ts = gcnew TraceSource("TestSource");
#if NOCONFIGFILE
    ts->Listeners->Add(gcnew EventSchemaTraceListener("TraceOutput.xml",
                            "eventListener", 65536,
                            TraceLogRetentionOption::LimitedCircularFiles,
                            20480000, 2));
    ts->Listeners["eventListener"]->TraceOutputOptions =
                                    TraceOptions::DateTime |
                                    TraceOptions::ProcessId |
                                    TraceOptions::Timestamp;
#endif
    EventSchemaTraceListener ^ ESTL =
               (EventSchemaTraceListener^)(ts->Listeners["eventListener"]);
    Console::WriteLine("IsThreadSafe?            = " + ESTL->IsThreadSafe);
    Console::WriteLine("BufferSize               = " + ESTL->BufferSize);
    Console::WriteLine("MaximumFileSize          = " + ESTL->MaximumFileSize);
    Console::WriteLine("MaximumNumberOfFiles     = " + ESTL->MaximumNumberOfFiles);
    Console::WriteLine("Name                     = " + ESTL->Name);
    Console::WriteLine("TraceLogRetentionOption  = " + ESTL->TraceLogRetentionOption.ToString());
    Console::WriteLine("TraceOutputOptions       = {0}\n", ESTL->TraceOutputOptions);
    ts->Switch->Level = SourceLevels::All;
    String ^ testString = "<Test><InnerElement Val=\"1\" />"
                        + "<InnerElement Val=\"Data\"/>"
                        + "<AnotherElement>11</AnotherElement></Test>";
    UnescapedXmlDiagnosticData ^ unXData = gcnew UnescapedXmlDiagnosticData(testString);
    ts->TraceData(TraceEventType::Error, 38, unXData);
    ts->TraceEvent(TraceEventType::Error, 38, testString);
    ts->Flush();
    ts->Close();
    Process::Start("notepad.exe", "TraceOutput.xml");
    Console::WriteLine("\nPress the enter key to exit");
    Console::ReadLine();
}
#define NOCONFIGFILE
using System;
using System.IO;
using System.Xml;
using System.Xml.XPath;
using System.Diagnostics;
class testClass
{
    [STAThreadAttribute]
    static void Main()
    {
        File.Delete("TraceOutput.xml");
        TraceSource ts = new TraceSource("TestSource");
#if NOCONFIGFILE
        //ts.Listeners.Add(new EventSchemaTraceListener("TraceOutput.xml", "eventListener", 65536, TraceLogRetentionOption.LimitedCircularFiles, 20480000, 2));
        ts.Listeners.Add(new EventSchemaTraceListener("TraceOutput.xml", "eventListener"));
        ts.Listeners["eventListener"].TraceOutputOptions = TraceOptions.DateTime | TraceOptions.ProcessId | TraceOptions.Timestamp;
#endif
        ts.Switch.Level = SourceLevels.All;
        string testString = "<Test><InnerElement Val=\"1\" /><InnerElement Val=\"Data\"/><AnotherElement>11</AnotherElement></Test>";
        UnescapedXmlDiagnosticData unXData = new UnescapedXmlDiagnosticData(testString);
        ts.TraceData(TraceEventType.Error, 38, unXData);
        ts.TraceEvent(TraceEventType.Error, 38, testString);
        Trace.Listeners.Add(new EventSchemaTraceListener("TraceOutput.xml"));
        Trace.Write("test", "test");
        Trace.Flush();
        ts.Flush();
        ts.Close();
        DisplayProperties(ts);
        Process.Start("notepad.exe", "TraceOutput.xml");
        Console.WriteLine("Press the enter key to exit");
        Console.ReadLine();
    }
    private static void DisplayProperties(TraceSource ts)
    {
        Console.WriteLine("IsThreadSafe? " + ((EventSchemaTraceListener)ts.Listeners["eventListener"]).IsThreadSafe);
        Console.WriteLine("BufferSize =  " + ((EventSchemaTraceListener)ts.Listeners["eventListener"]).BufferSize);
        Console.WriteLine("MaximumFileSize =  " + ((EventSchemaTraceListener)ts.Listeners["eventListener"]).MaximumFileSize);
        Console.WriteLine("MaximumNumberOfFiles =  " + ((EventSchemaTraceListener)ts.Listeners["eventListener"]).MaximumNumberOfFiles);
        Console.WriteLine("Name =  " + ((EventSchemaTraceListener)ts.Listeners["eventListener"]).Name);
        Console.WriteLine("TraceLogRetentionOption =  " + ((EventSchemaTraceListener)ts.Listeners["eventListener"]).TraceLogRetentionOption);
        Console.WriteLine("TraceOutputOptions =  " + ((EventSchemaTraceListener)ts.Listeners["eventListener"]).TraceOutputOptions);
    }
}
#Const NOCONFIGFILE = True
Imports System.IO
Imports System.Xml
Imports System.Xml.XPath
Imports System.Diagnostics
Class testClass
    <STAThreadAttribute()> _
    Shared Sub Main()
        File.Delete("TraceOutput.xml")
        Dim ts As New TraceSource("TestSource")
#If NOCONFIGFILE Then
        ts.Listeners.Add(New EventSchemaTraceListener("TraceOutput.xml", "eventListener", 65536, TraceLogRetentionOption.LimitedCircularFiles, 20480000, 2))
        ts.Listeners("eventListener").TraceOutputOptions = TraceOptions.DateTime Or TraceOptions.ProcessId Or TraceOptions.Timestamp
#End If
        ts.Switch.Level = SourceLevels.All
        Dim testString As String = "<Test><InnerElement Val=""1"" /><InnerElement Val=""Data""/><AnotherElement>11</AnotherElement></Test>"
        Dim unXData As New UnescapedXmlDiagnosticData(testString)
        ts.TraceData(TraceEventType.Error, 38, unXData)
        ts.TraceEvent(TraceEventType.Error, 38, testString)
        ts.Flush()
        ts.Close()
        DisplayProperties(ts)
        Process.Start("notepad.exe", "TraceOutput.xml")
        Console.WriteLine("Press the enter key to exit")
        Console.ReadLine()
    End Sub
    Private Shared Sub DisplayProperties(ByVal ts As TraceSource)
        Console.WriteLine("IsThreadSafe? " + CType(ts.Listeners("eventListener"), EventSchemaTraceListener).IsThreadSafe.ToString())
        Console.WriteLine("BufferSize =  " + CType(ts.Listeners("eventListener"), EventSchemaTraceListener).BufferSize.ToString())
        Console.WriteLine("MaximumFileSize =  " + CType(ts.Listeners("eventListener"), EventSchemaTraceListener).MaximumFileSize.ToString())
        Console.WriteLine("MaximumNumberOfFiles =  " + CType(ts.Listeners("eventListener"), EventSchemaTraceListener).MaximumNumberOfFiles.ToString())
        Console.WriteLine("Name =  " + CType(ts.Listeners("eventListener"), EventSchemaTraceListener).Name)
        Console.WriteLine("TraceLogRetentionOption =  " + CType(ts.Listeners("eventListener"), EventSchemaTraceListener).TraceLogRetentionOption.ToString())
        Console.WriteLine("TraceOutputOptions =  " + CType(ts.Listeners("eventListener"), EventSchemaTraceListener).TraceOutputOptions.ToString())
    End Sub
End Class
注解
类 EventSchemaTraceListener 提供对符合架构的端到端事件的跟踪。 可以对具有跨线程、 AppDomain进程和计算机边界的异类组件的系统使用端到端跟踪。 标准化事件架构支持跨这些边界进行跟踪。 此外,该架构允许添加符合架构的自定义元素。 可以使用 服务跟踪查看器工具 (SvcTraceViewer.exe) 来显示事件数据。
EventSchemaTraceListener 针对日志记录性能进行了优化,并隐式支持无锁跟踪。
类 EventSchemaTraceListener 将跟踪和调试信息转换为 XML 编码的文本流。 XML 输出的说明在本部分后面的表中显示。
可以在代码中创建 EventSchemaTraceListener 对象。 或者,对于.NET Framework应用,可以通过应用程序配置文件启用或禁用对象EventSchemaTraceListener,然后在应用程序中使用配置EventSchemaTraceListener的对象。 有关在 .NET Framework 应用中使用配置文件进行跟踪和调试的信息,请参阅跟踪和调试设置架构。
若要在.NET Framework应用中配置EventSchemaTraceListener对象,请修改与应用程序名称对应的配置文件。 在此文件中,可以添加、删除或设置侦听器的属性。 配置文件的格式应如下所示:
<configuration>  
    <system.diagnostics>  
        <sources>  
            <source name="TestSource" >  
                <listeners>  
                    <!--Remove the default trace listener for better performance.-->  
                    <remove name="Default"/>  
                    <!--Note: Removing the default trace listener prevents the dialog box   
                    from being displayed for Debug.Fail or Debug.Assert commands that are   
                    executed in user mode.-->  
                    <add name="eventListener"   
                      type="System.Diagnostics.EventSchemaTraceListener,  system.core"  
                      initializeData="TraceOutput.xml"   
                      traceOutputOptions="ProcessId, DateTime, Timestamp"   
                      bufferSize="65536"  
                      maximumFileSize="20480000"  
                      logRetentionOption="LimitedCircularFiles"  
                      maximumNumberOfFiles="2"/>  
                </listeners>  
            </source>  
        </sources>  
    </system.diagnostics>  
类EventSchemaTraceListener从基类 TraceListener继承 Filter 属性。 属性 Filter 允许对侦听器进行额外的跟踪输出筛选。 如果存在筛选器, Trace 则跟踪侦听器的方法会调用 ShouldTrace 筛选器的 方法,以确定是否发出跟踪。
如果尝试写入正在使用或不可用的文件,则 GUID 后缀会自动添加到文件名中。
注意
侦听器方法旨在由 、 Trace和 TraceSource 类的方法Debug调用。 不要直接从应用程序代码调用侦听器方法。 侦听器 EventSchemaTraceListener 主要用于 类 TraceSource 。
下表描述了 XML 输出的元素和属性。
| 元素 | 属性 | 输出 | 说明 | 
|---|---|---|---|
| CallStack | 无 | 取决于 属性中TraceOutputOptions是否存在 Callstack 标志。 | 特殊字符(如 > 或 < )将替换为转义序列。 请参阅下表中的转义字符转换表。 | 
| Computer | 无 | 始终显示。 | 此元素表示 属性的值 MachineName 。 | 
| Correlation | ActivityID | 始终显示。 | 如果未 ActivityID指定 ,则默认值为空 GUID。 | 
| RelatedActivityID | 取决于方法调用中 Trace是否存在relatedActivityId参数。 | 特性 RelatedActivityID对应于relatedActivityId方法的 TraceTransfer 参数。 | |
| Data | 无 | 始终显示。 | 此元素表示参数输入 ( data) 。 为每个数据对象提供一个元素。 对于事件日志,元素Data包含转义的 XML 数据。 对于数据日志,元素Data包含未转义的数据。 数据日志输出使用ToString传入数据对象的 方法。 | 
| Event | 无 | 始终显示。 | 此元素包含跟踪事件。 | 
| EventData | 无 | 用于事件日志。 | 此元素表示参数输入 ( message、args) 。 它包含Data具有通过调用 TraceEvent 方法创建的转义 XML 数据的元素。 | 
| EventID | 无 | 始终显示。 | 此元素表示参数输入 ( id) 。 | 
| Execution | ProcessID | 取决于 属性中TraceOutputOptions是否存在 ProcessId 标志。 | 特性 ProcessID在 中 TraceEventCache指定。 | 
| ThreadID | 当 存在 时 ProcessID显示。 | 特性 ThreadID在 中 TraceEventCache指定。 | |
| Level | 无 | 始终显示。 | 此元素表示参数输入 () 的 eventType数值。 大于 255 的参数值输出为级别 8,表示 TraceEventType.Information。 跟踪事件类型 Critical、 Error、 Warning、 Information和 Verbose 分别输出为级别 1、2、4、8 和 10。 | 
| LogicalOperationStack | 无 | 取决于 属性中TraceOutputOptions是否存在 LogicalOperationStack 标志。 | 只能存在一个逻辑操作。 因此,值将作为 LogicalOperation节点写入 元素LogicalOperationStack下。 | 
| OpCode | 无 | 当 大于 255 时 Level显示。 | 此元素表示数值大于 255 的 Trace 事件类型。 Start、 Stop、 Suspend、 Resume或 Transfer 分别输出为级别 1、2、4、8 和 10。 | 
| Provider | GUID | 始终显示。 | 始终为空。 | 
| RenderingInfo | Culture | 始终显示。 | 此属性表示事件类型的资源字符串。 它始终为“en-EN\”。 | 
| System | Name | 始终显示。 | |
| TimeCreated | SystemTime | 取决于 属性中TraceOutputOptions是否存在 DateTime 标志。 | 时间是 属性的值 TraceEventCache.DateTime 。 此属性表示为协调世界时 | 
| TimeStamp | 无 | 取决于 属性中TraceOutputOptions是否存在 Timestamp 标志。 | 此元素在 中 TraceEventCache指定。 | 
| UserData | 无 | 用于数据日志。 | 此元素包含 Data具有方法中用户提供的未转义数据的 TraceData 元素。 | 
下表显示了 XML 输出中转义的字符。 转义发生在除 元素之外 UserData 的所有元素和属性中,元素包含用户提供的未转义数据。 元素 UserData 是调用 TraceData 方法的结果。
| 转义字符 | “值” | 
|---|---|
| & | & | 
| < | < | 
| > | > | 
| " | " | 
| |' | |
| 0xD | |
| 0xA | 
构造函数
| EventSchemaTraceListener(String) | 通过将指定文件用作调试和跟踪输出的接收方来初始化 EventSchemaTraceListener 类的新实例。 | 
| EventSchemaTraceListener(String, String) | 通过将指定文件用作调试和跟踪输出的接收方,来初始化具有指定名称的 EventSchemaTraceListener 类的新实例。 | 
| EventSchemaTraceListener(String, String, Int32) | 通过将指定文件用作调试和跟踪输出的接收方,来初始化具有指定名称和指定缓冲区大小的 EventSchemaTraceListener 类的新实例。 | 
| EventSchemaTraceListener(String, String, Int32, TraceLogRetentionOption) | 通过将具有指定日志保留策略的指定文件用作调试和跟踪输出的接收方,来初始化具有指定名称和指定缓冲区大小的 EventSchemaTraceListener 类的新实例。 | 
| EventSchemaTraceListener(String, String, Int32, TraceLogRetentionOption, Int64) | 通过将具有指定日志保留策略和最大大小的指定文件用作调试和跟踪输出的接收方,来初始化具有指定名称和缓冲区大小的 EventSchemaTraceListener 类的新实例。 | 
| EventSchemaTraceListener(String, String, Int32, TraceLogRetentionOption, Int64, Int32) | 通过将具有指定日志保留策略、最大大小和文件计数的指定文件用作调试和跟踪输出的接收方,来初始化具有指定名称和指定缓冲区大小的 EventSchemaTraceListener 类的新实例。 | 
属性
| Attributes | 获取应用程序配置文件中定义的自定义跟踪侦听器特性。(继承自 TraceListener) | 
| BufferSize | 获取输出缓冲区的大小。 | 
| Filter | 获取或设置跟踪侦听器的跟踪筛选器。(继承自 TraceListener) | 
| IndentLevel | 获取或设置缩进级别。(继承自 TraceListener) | 
| IndentSize | 获取或设置缩进的空格数。(继承自 TraceListener) | 
| IsThreadSafe | 获取一个值,该值指示跟踪侦听器是否是线程安全的。 | 
| MaximumFileSize | 获取日志文件的最大大小。 | 
| MaximumNumberOfFiles | 获取日志文件最大数。 | 
| Name | 获取或设置此 TraceListener 的名称。(继承自 TraceListener) | 
| NeedIndent | 获取或设置一个值,该值指示是否缩进输出。(继承自 TraceListener) | 
| TraceLogRetentionOption | 获取该文件的跟踪日志保留选项。 | 
| TraceOutputOptions | 获取或设置跟踪输出选项。(继承自 TraceListener) | 
| Writer | 获取或设置写入日志文件的基础文本编写器。 |