EventSchemaTraceListener 类

定义

将端对端事件的跟踪或调试输出定向到 XML 编码的符合架构的日志文件。

public ref class EventSchemaTraceListener : System::Diagnostics::TextWriterTraceListener
public class EventSchemaTraceListener : System.Diagnostics.TextWriterTraceListener
type EventSchemaTraceListener = class
    inherit TextWriterTraceListener
Public 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 后缀会自动添加到文件名。

注意

侦听器方法旨在由 、 TraceTraceSource 类的方法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 用于事件日志。 此元素表示参数输入 (messageargs) 。 它包含 Data 具有通过调用 TraceEvent 方法创建的转义 XML 数据的元素。
EventID 始终显示。 此元素表示参数输入 (id) 。
Execution ProcessID 取决于 属性中TraceOutputOptions是否存在 ProcessId 标志。 特性 ProcessID 在 中 TraceEventCache指定。
ThreadID 当 存在 时 ProcessID 显示。 特性 ThreadID 在 中 TraceEventCache指定。
Level 始终显示。 此元素表示参数输入 () 的 eventType 数值。 大于 255 的参数值输出为级别 8,表示 TraceEventType.Information。 跟踪事件类型 CriticalErrorWarningInformationVerbose 分别输出为级别 1、2、4、8 和 10。
LogicalOperationStack 取决于 属性中TraceOutputOptions是否存在 LogicalOperationStack 标志。 只能存在一个逻辑操作。 因此,值将作为 LogicalOperation 节点写入 元素 LogicalOperationStack 下。
OpCode 当 大于 255 时 Level 显示。 此元素表示数值大于 255 的 Trace 事件类型。 StartStopSuspendResumeTransfer 分别输出为级别 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

获取或设置写入日志文件的基础文本编写器。

方法

Close()

关闭该侦听器的日志文件,以使其不再接收跟踪或调试输出。

CreateObjRef(Type)

创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。

(继承自 MarshalByRefObject)
Dispose()

释放由 TraceListener 使用的所有资源。

(继承自 TraceListener)
Dispose(Boolean)

处置此 TextWriterTraceListener 对象。

(继承自 TextWriterTraceListener)
Equals(Object)

确定指定对象是否等于当前对象。

(继承自 Object)
Fail(String)

实现 TraceListener 类时,向所创建的侦听器发出错误信息。

(继承自 TraceListener)
Fail(String, String)

将包含基本错误消息和详细错误消息的错误信息写入日志文件。

Flush()

导致缓冲数据写入该侦听器的日志。

GetHashCode()

作为默认哈希函数。

(继承自 Object)
GetLifetimeService()
已过时.

检索控制此实例的生存期策略的当前生存期服务对象。

(继承自 MarshalByRefObject)
GetSupportedAttributes()

获取跟踪侦听器支持的自定义 XML 配置特性。

GetType()

获取当前实例的 Type

(继承自 Object)
InitializeLifetimeService()
已过时.

获取生存期服务对象来控制此实例的生存期策略。

(继承自 MarshalByRefObject)
MemberwiseClone()

创建当前 Object 的浅表副本。

(继承自 Object)
MemberwiseClone(Boolean)

创建当前 MarshalByRefObject 对象的浅表副本。

(继承自 MarshalByRefObject)
ToString()

返回表示当前对象的字符串。

(继承自 Object)
TraceData(TraceEventCache, String, TraceEventType, Int32, Object)

将跟踪信息、单个数据对象和事件信息写入日志文件。

TraceData(TraceEventCache, String, TraceEventType, Int32, Object[])

将跟踪信息、多个数据对象和事件信息写入日志文件。

TraceEvent(TraceEventCache, String, TraceEventType, Int32)

向特定于侦听器的输出写入跟踪和事件信息。

(继承自 TraceListener)
TraceEvent(TraceEventCache, String, TraceEventType, Int32, String)

将跟踪信息、消息和事件信息写入日志文件。

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

将跟踪信息、格式化消息和事件信息写入日志文件。

TraceTransfer(TraceEventCache, String, Int32, String, Guid)

将跟踪信息(包括相关活动的标识)、消息和事件信息写入日志文件。

Write(Object)

实现 ToString() 类时,向所创建的侦听器写入对象的 TraceListener 方法值。

(继承自 TraceListener)
Write(Object, String)

实现 ToString() 类时,向所创建的侦听器写入类别名称和对象的 TraceListener 方法值。

(继承自 TraceListener)
Write(String)

将消息写入日志文件,且不提供任何其他上下文信息。

Write(String, String)

实现 TraceListener 类时,向所创建的侦听器写入类别名称和消息。

(继承自 TraceListener)
WriteIndent()

实现此类时,向所创建的侦听器写入缩进,并将 NeedIndent 属性重置为 false

(继承自 TraceListener)
WriteLine(Object)

实现 TraceListener 类时,向所创建的侦听器写入对象的 ToString() 方法值,后跟行结束符。

(继承自 TraceListener)
WriteLine(Object, String)

实现 TraceListener 类时,向所创建的侦听器写入类别名称和对象的 ToString() 方法值,后跟行结束符。

(继承自 TraceListener)
WriteLine(String)

将后跟当前行终止符的消息写入日志文件,且不提供任何其他上下文信息。

WriteLine(String, String)

实现 TraceListener 类时,向所创建的侦听器写入类别名称和消息,后跟行结束符。

(继承自 TraceListener)

适用于