本主题介绍如何启用跟踪、配置跟踪源以发出跟踪和设置跟踪级别、设置活动跟踪和传播以支持端到端跟踪关联,以及设置跟踪侦听器以访问跟踪。
有关生产或调试环境中的跟踪设置建议,请参阅 “跟踪和消息日志记录的建议设置”。
重要
在 Windows 8 上,必须运行提升的应用程序(以管理员身份运行),以便应用程序生成跟踪日志。
启用跟踪
Windows Communication Foundation (WCF) 输出以下数据进行诊断跟踪:
跨应用程序的所有组件(例如操作调用、代码异常、警告和其他重要处理事件)的处理里程碑的跟踪。
跟踪功能故障时的 Windows 错误事件。 请参阅 事件日志记录。
WCF 的跟踪功能是建立在 System.Diagnostics 之上的。 若要使用跟踪,应在配置文件或代码中定义跟踪源。 WCF 为每个 WCF 程序集定义跟踪源。
System.ServiceModel
跟踪源是主要的 WCF 跟踪源,记录 WCF 通信堆栈中的关键处理事件,从进入/离开传输层到进入/离开用户代码。
System.ServiceModel.MessageLogging
跟踪源记录流经系统的所有消息。
默认情况下,不启用跟踪。 若要激活跟踪,必须创建跟踪侦听器,并在配置中为所选跟踪源设置“关闭”以外的跟踪级别;否则,WCF 不会生成任何跟踪。 如果未指定侦听器,则会自动禁用跟踪。 如果定义了侦听器,但没有指定级别,则默认情况下该级别设置为“Off”,这意味着不会发出任何跟踪。
如果使用 WCF 扩展点(如自定义操作调用程序),则应发出自己的跟踪。 这是因为,如果实现扩展点,WCF 将无法再在默认路径中发出标准跟踪。 如果未通过发出跟踪实现手动跟踪支持,则可能看不到预期跟踪。
您可以通过编辑应用程序的配置文件来配置跟踪:对于 Web 托管的应用程序,请使用 Web.config,对于自承载的应用程序,请使用 Appname.exe.config。 下面是此类编辑的示例。 有关这些设置的更多信息,请参见“配置要使用跟踪的跟踪侦听器”一节。
<configuration>
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="traceListener"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData= "c:\log\Traces.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
</configuration>
注释
若要在 Visual Studio 中编辑 WCF 服务项目的配置文件,请右键单击应用程序的配置文件,即 web 托管应用程序的 Web.config,或者在 解决方案资源管理器中为自承载应用程序 Appname.exe.config。 然后选择 “编辑 WCF 配置 ”上下文菜单项。 这会启动 配置编辑器工具(SvcConfigEditor.exe),这使你可以使用图形用户界面修改 WCF 服务的配置设置。
配置要发出跟踪的跟踪源
WCF 为每个程序集定义跟踪源。 在程序集中生成的跟踪由为该跟踪源定义的侦听器访问。 定义了以下跟踪源:
System.ServiceModel:记录 WCF 处理的所有阶段,每当读取配置时,都会在传输中处理消息、安全处理、在用户代码中调度消息等。
System.ServiceModel.MessageLogging:记录流经系统的所有消息。
System.IdentityModel。
System.ServiceModel.Activation。
System.IO.Log:将 .NET Framework 接口的日志记录到通用日志文件系统(CLFS)。
System.Runtime.Serialization:当对象被读取或写入时记录日志。
CardSpace。
可以将每个跟踪源配置为使用相同的(共享)侦听器,如以下配置示例所示。
<configuration>
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="xml" />
</listeners>
</source>
<source name="CardSpace">
<listeners>
<add name="xml" />
</listeners>
</source>
<source name="System.IO.Log">
<listeners>
<add name="xml" />
</listeners>
</source>
<source name="System.Runtime.Serialization">
<listeners>
<add name="xml" />
</listeners>
</source>
<source name="System.IdentityModel">
<listeners>
<add name="xml" />
</listeners>
</source>
</sources>
<sharedListeners>
<add name="xml"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="c:\log\Traces.svclog" />
</sharedListeners>
</system.diagnostics>
</configuration>
此外,还可以添加用户定义的跟踪源,如以下示例所示,发出用户代码跟踪。
<system.diagnostics>
<sources>
<source name="UserTraceSource" switchValue="Warning, ActivityTracing" >
<listeners>
<add name="xml"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="C:\logs\UserTraces.svclog" />
</listeners>
</source>
</sources>
<trace autoflush="true" />
</system.diagnostics>
有关创建用户定义的跟踪源的详细信息,请参阅 “扩展跟踪”。
配置要使用跟踪的跟踪侦听器
在运行时,WCF 将跟踪数据馈送给处理数据的侦听器。 WCF 提供了多个用于 System.Diagnostics 的预定义侦听器,这些侦听器在输出格式上有所不同。 还可以添加自定义侦听器类型。
可用于 add
指定要使用的跟踪侦听器的名称和类型。 在我们的示例配置中,我们将侦听器命名为侦听器 traceListener
,并将标准 .NET Framework 跟踪侦听器 (System.Diagnostics.XmlWriterTraceListener
) 添加为要使用的类型。 可以为每个源添加任意数量的跟踪侦听器。 如果跟踪侦听器向文件发出跟踪,则必须在配置文件中指定输出文件位置和名称。 为此,请将 initializeData
设置为该侦听器的文件名。 如果未指定文件名,则会根据所使用的侦听器类型生成随机文件名。 如果使用 XmlWriterTraceListener ,将生成没有扩展名的文件名。 如果实现自定义侦听器,还可以使用此属性接收文件名以外的初始化数据。 例如,可以为此属性指定数据库标识符。
可以配置自定义跟踪侦听器,将跟踪通过网络传输,例如发送到远程数据库。 作为应用程序部署程序,应在远程计算机上的跟踪日志上强制实施适当的访问控制。
还可以以编程方式配置跟踪侦听器。 有关详细信息,请参阅 如何:创建和初始化跟踪侦听器 以及 创建自定义 TraceListener。
谨慎
由于 System.Diagnostics.XmlWriterTraceListener
不是线程安全的,因此在输出跟踪时,跟踪源可能会以独占方式锁定资源。 当许多线程将跟踪输出到配置为使用此侦听器的跟踪源时,可能会发生资源争用,这会导致严重的性能问题。 若要解决此问题,应实现线程安全的自定义侦听器。
跟踪级别
跟踪级别由 switchValue
跟踪源的设置控制。 下表描述了可用的跟踪级别。
跟踪级别 | 跟踪事件的性质 | 跟踪事件的内容 | 被跟踪事件 | 用户目标 |
---|---|---|---|---|
关闭 | 无 | 无 | 不会发出任何痕迹。 | 无 |
危急 | 负面事件:指示意外的处理过程或错误状态的事件。 | 记录未经处理的异常,包括以下内容: - OutOfMemoryException(内存不足异常) - ThreadAbortException(CLR 调用任何 ThreadAbortExceptionHandler) - StackOverflowException(无法捕获) - ConfigurationErrorsException - SEHException - 应用程序启动错误 - Failfast 事件 - 系统挂起 - 病毒消息:导致应用程序失败的消息跟踪。 |
管理员 应用程序开发人员 |
|
错误 | 负面事件:指示意外的处理过程或错误状态的事件。 | 已发生意外处理。 应用程序无法按预期执行任务。 但是,应用程序仍处于启动状态并正在运行。 | 记录所有异常。 | 管理员 应用程序开发人员 |
警告 | 负面事件:指示意外的处理过程或错误状态的事件。 | 可能出现的问题已发生或可能发生,但应用程序仍然正常运行。 但是,它可能无法继续正常工作。 | - 应用程序接收的请求数超过其限制设置允许的请求数。 - 接收队列接近其最大配置容量。 - 已经超时。 - 凭据被拒绝。 |
管理员 应用程序开发人员 |
信息 | “积极”事件:标记成功里程碑的事件 | 应用程序执行的重要和成功的里程碑,无论应用程序是否正常工作。 | 通常,生成对监视和诊断系统状态、测量性能或执行分析十分有用的消息。 可以使用此类信息进行容量规划和性能管理: - 创建频道。 - 创建终结点侦听器。 - 消息进入/离开传输系统。 - 检索安全标记。 - 读取配置设置。 |
管理员 应用程序开发人员 产品开发人员。 |
详细 | “积极”事件:标记成功里程碑的事件。 | 发出用户代码和服务的低级别事件。 | 一般情况下,可以使用此级别进行调试或应用程序优化。 - 已理解消息头。 |
管理员 应用程序开发人员 产品开发人员。 |
ActivityTracing | 处理活动与组件之间的流事件。 | 此级别允许管理员和开发人员关联同一应用程序域中的应用程序: - 活动边界跟踪,如启动/停止。 - 传输跟踪。 |
全部 | |
全部 | 应用程序可以正常运行。 发出所有事件。 | 所有以前的事件。 | 全部 |
从“详细”到“严重”的级别彼此堆叠,即每个跟踪级别都包括其上除“禁用”级别以外的所有级别。 例如,在“警告”级别进行侦听的侦听器会接收到“严重”、“错误”和“警告”跟踪。 “全部”级别包括从“详细”到“严重”的事件以及活动跟踪事件。
谨慎
“信息”、“详细”和“ActivityTracing”级别会生成大量跟踪,这可能会对消息吞吐量产生不利影响(如果计算机上的所有可用资源均已用尽)。
配置活动跟踪和传播以实现相关性
为 activityTracing
属性指定的 switchValue
值用于启用活动跟踪,这会在终结点内发出活动边界跟踪和传输跟踪。
注释
在 WCF 中使用某些扩展性功能时,启用活动跟踪时可能会出现 NullReferenceException 。 若要解决此问题,请检查应用程序的配置文件,并确保 switchValue
跟踪源的属性未设置为 activityTracing
。
该 propagateActivity
属性指示活动是否应传播到参与消息交换的其他终结点。 通过将此值设置为 true
,可以获取任何两个终结点生成的跟踪文件,并观察一个终结点上的一组跟踪如何流向另一终结点上的一组跟踪。
有关活动跟踪和传播的详细信息,请参阅 传播。
这两个 propagateActivity
值和 ActivityTracing
布尔值都适用于 System.ServiceModel TraceSource。 该值 ActivityTracing
也适用于任何跟踪源,包括 WCF 或用户定义的源。
不能将 propagateActivity
属性与用户定义的跟踪源一起使用。 对于用户代码活动 ID 传播,请确保未设置 ServiceModel ActivityTracing
,同时仍将 ServiceModel propagateActivity
属性设置为 true
。