EventSchemaTraceListener 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
将端对端事件的跟踪或调试输出定向到 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 后缀会自动添加到文件名中。
注意
侦听器方法旨在由 、 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 |
获取或设置写入日志文件的基础文本编写器。 |