WCF 跟踪 FAQ






4.47/5 (10投票s)
WCF 跟踪 FAQ
目录
- 引言和目标
- WCF 基本问答
- 能否解释一下 Trace Listener 的概念?
- 现成的跟踪事件有哪些?它们适用于哪些 WCF 对象?
- 如何为现成的 WCF 对象启用跟踪?
- Trace Listeners 中的 tracelevel 是什么概念?
- 什么是服务级消息和传输级消息?
引言和目标
在本文中,我们将探讨如何在 WCF 服务中跟踪和调试信息。WCF 提供了一些现成的跟踪监听器。这些现成的跟踪监听器的基础是 .NET 跟踪监听器。因此,我们将首先理解跟踪监听器的基本概念,然后介绍 WCF 提供的现成跟踪监听器。
如今,我正在分发我 400 个问答电子书,其中涵盖了主要的 .NET 相关主题,如 WCF、WPF、WWF、Ajax、Core .NET、SQL Server、架构等等。我相信您会喜欢 这本电子书。
WCF 基本问答
如果您是 WCF 新手,我建议您在阅读本文之前先阅读我的 WCF 常见问题解答。它将帮助您理解 WCF 的基础知识,以便您能更好地理解本文。
能否解释一下 Trace Listener 的概念?
Tracelistener
s 是从 trace 类获取跟踪信息的对象,并将数据输出到某个媒介。例如,从图 TraceListener
中可以看到它是如何监听 trace 对象并将相同的数据输出到 UI、文件或 Windows 事件日志的。有三种不同的 tracelistener
类型:第一种是 defaulttracelistener
(它将数据输出到 UI),第二种是 textwritertracelistener
(它将数据输出到文件),最后一种是 'Eventlogtracelistener
',它将相同的数据输出到 Windows 事件日志。
下面是 textwritertracelistener
和 eventlogtracelistener
的代码片段。使用 textwritertracelistener
,我们将跟踪转发到了 ErrorLog.txt 文件,在第二个代码片段中,我们使用了 Eventlogtracelistener
将跟踪转发到了 Windows 事件日志。
现成的跟踪事件有哪些?它们适用于哪些 WCF 对象?
您始终可以使用 .NET 提供的核心 Tracelistener
事件,但 WCF 为核心 WCF 对象提供了现成的跟踪监听器。
程序集名称 | 描述 |
System.ServiceModel |
记录以下内容:
|
System.ServiceModel.MessageLogging |
为系统中流过的每条消息生成跟踪信息。 |
System.ServiceModel.IdentityModel |
为身份验证和授权生成跟踪数据。 |
System.ServiceModel.Activation |
发出有关服务激活的信息。 |
System.Runtime.Serialization |
对象序列化或反序列化时发出信息。WCF 在请求过程中始终进行序列化和反序列化,因此这是一个查看请求内容的好事件。 |
System.IO.Log |
发出与通用日志文件系统 (CLFS) 相关的消息。 |
CardSpace |
发出与 WCF 上下文中发生的任何 CardSpace 身份处理相关的跟踪消息。 |
如何为现成的 WCF 对象启用跟踪?
我们将为 System.ServiceModel
跟踪对象启用跟踪。要启用跟踪,我们需要在 WCF 服务的 web.config 文件中启用 system.diagnostics
XML 节点。我们还需要为 System.ServiceModel
监听器对象定义监听器的类型。因此,我们添加 listeners
标记,类型为 System.Diagnostics.XmlWriterTraceListener
。我们还需要定义创建文件的文件和路径。对于当前场景,我们已将文件定义为 Traces.svclog
,并将文件夹定义为 c:\ 驱动器。
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing">
<listeners>
<add name="log"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="c:\Traces.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
现在,如果您运行 WCF 服务,您可以看到一个 XML 文件创建,如下所示
#<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
<System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system">
<EventID>0</EventID>
<Type>3</Type>
<SubType Name="Transfer">0</SubType>
<Level>255</Level>
<TimeCreated SystemTime="2009-04-30T03:21:09.5625000Z" />
<Source Name="System.ServiceModel" />
<Correlation ActivityID="{00000000-0000-0000-0000-000000000000}"
RelatedActivityID="{d11829b7-d2db-46d5-a4ac-49a37a56376e}" />
<Execution ProcessName="WebDev.WebServer" ProcessID="2660" ThreadID="8" />
<Channel/>
<Computer>COMPAQ-JZP37MD0</Computer>
</System>
<ApplicationData></ApplicationData>
</E2ETraceEvent>
Trace Listeners 中的 tracelevel 是什么概念?
在上一个问题中,我们已将 switch 值指定为 information。此值指示您要记录什么类型和级别的跟踪信息。以下是该列表。
跟踪级别 | 描述 |
关闭 |
忽略所有跟踪消息 |
关键 |
记录意外处理事件或未处理的异常。应用程序将立即或 shortly 终止。 |
Error(错误) |
发生了意外的处理事件或异常。应用程序仍能够继续处理。 |
警告 |
表示可能存在问题,但应用程序将继续运行。 |
信息 |
应用程序运行顺利,只记录了信息性消息。在这种情况下,消息只是里程碑。 |
Verbose(详细) |
与信息非常相似,但提供更多细节。 |
ActivityTracing |
在这种情况下,消息与组件之间的通信以及活动相关。 |
全部 |
在这种情况下,所有消息都被捕获。 |
跟踪级别值在 switch 值中的 source
标记中指定。例如,下面的 web.config 代码片段将跟踪类型指示为 Information
。
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing">
............
............
............
............
什么是服务级消息和传输级消息?
您可以记录 WCF 消息的两个级别:一个是服务级别,另一个是传输级别。服务级别:在此级别,消息在进入用户代码或离开用户代码时进行记录。
传输级别:在此级别,消息在准备编码/解码时进行记录。所有传输级别、基础设施消息以及可靠性消息都将被记录。您可以在 diagnostics 节点中指定消息级别,如下面的代码片段所示。
<system.serviceModel>
<diagnostics>
<messageLogging
logEntireMessage="true"
logMalformedMessages="false"
logMessagesAtServiceLevel="false"
logMessagesAtTransportLevel="true"
maxMessagesToLog="3000"
maxSizeOfMessageToLog="10000"/>
</diagnostics>
</system.serviceModel>
Messagelogging
还有其他属性。以下是关于它们的简要描述。
Attribute | 描述 |
logEntireMessage |
是否应记录整个消息,还是只记录报头。 |
logMalformedMessages |
是否应记录格式错误的邮件。 |
logMessagesAtServiceLevel |
是否应记录服务级别的消息。 |
logMessagesAtTransportLevel |
是否应记录传输级别的消息。 |
maxMessageToLog |
表示应记录多少条消息的数字。 |
maxSizeOfMessageToLog |
默认值为 256Kb。消息日志的最大大小。 |
历史
- 2009 年 4 月 30 日:初始发布