诊断跟踪

跟踪是指发布在执行应用程序期间生成的特定消息。 使用跟踪时,必须有一个机制来收集和记录发送的消息。 跟踪消息由侦听器来接收。 侦听器的目的是收集、存储和路由跟踪消息。 侦听器将跟踪输出定向到相应的目标,例如日志、窗口或文本文件。

启用跟踪时,会自动创建并初始化此类侦听器 DefaultTraceListener。 如果要将跟踪输出定向到任何其他源,则必须创建和初始化其他跟踪侦听器。 所创建的侦听器应反映您的具体需要。 例如,可能需要所有跟踪输出的文本记录。 在这种情况下,你将创建一个侦听器,以便在启用时将所有输出写入新文本文件。 另一方面,你可能只想在应用程序执行期间查看输出。 在这种情况下,可以创建将所有输出定向到控制台窗口的侦听器。 EventLogTraceListener 可以将跟踪输出定向到事件日志,TextWriterTraceListener 可以将跟踪输出写入流。

启用跟踪

若要在事务处理期间启用跟踪,应编辑应用程序的配置文件。 下面是一个示例。

<configuration>  
<system.diagnostics>  
     <sources>  
          <source name="System.Transactions" switchValue="Warning">  
               <listeners>  
                    <add name="tx"
                     type="System.Diagnostics.XmlWriterTraceListener"
                     initializeData= "tx.log" />  
               </listeners>  
          </source>  
     </sources>  
</system.diagnostics>  
</configuration>  

System.Transactions 跟踪将写入到一个名为“System.Transactions”的源。 可用于 add 指定要使用的跟踪侦听器的名称和类型。 在我们的示例配置中,我们将侦听器命名为“tx”,并添加了标准 .NET Framework 跟踪侦听器(XmlWriterTraceListener)作为要使用的类型。 用于 initializeData 设置该侦听器的日志文件的名称。 此外,还可以将完全限定的路径替换为简单的文件名。

为每个跟踪消息类型分配一个级别来指示其重要性程度。 如果应用域的跟踪级别等于或低于事件类型的级别,则会生成该消息。 跟踪级别由 switchValue 配置文件中的设置控制。 下表中定义了与诊断跟踪消息关联的级别。

跟踪级别 DESCRIPTION
危急 发生严重故障,如以下情况:

- 可能导致用户功能立即丢失的错误。
- 需要管理员采取措施以避免功能丢失的事件。
- 代码挂起。
- 此跟踪级别还可以提供足够的上下文来解释其他关键跟踪。 这有助于确定导致严重故障的作序列。
错误 发生错误(例如,配置或网络行为无效),可能会导致用户功能丢失。
警告 存在一个条件,随后可能导致错误或严重故障(例如分配失败或接近限制)。 用户代码的错误(例如事务中止、超时、身份验证失败)的正常处理也可能生成警告。
信息 生成有助于监视和诊断系统状态、测量性能或进行性能分析的消息。 这些消息可包括事务和登记生存期事件,如创建或提交事务、跨重要边界或分配重要资源等。 然后,开发人员可以利用这些信息进行容量规划和性能管理。

跟踪代码

下表列出了基础结构生成的 System.Transactions 跟踪代码。 表中包括跟踪代码标识符、 EventType 跟踪的枚举级别以及 跟踪的 TraceRecord 中包含的额外数据。 此外,跟踪的相应跟踪级别也存储在 TraceRecord 中。

追踪码 事件类型 TraceRecord 中的额外数据
交易已创建 信息 交易跟踪标识符
TransactionPromoted 信息 本地事务跟踪标识、分布式事务跟踪标识
EnlistmentCreated 信息 TransactionTraceId、EnlistmentTraceId、EnlistmentType(持久/可变)、EnlistmentOptions
EnlistmentCallbackNegative 警告 TransactionTraceId、EnlistmentTraceId

回调 (forcerollback/aborted/indoubt)
TransactionRollbackCalled 警告 交易跟踪标识符
交易中止 警告 交易跟踪标识符
TransactionInDoubt 警告 交易跟踪标识符
TransactionScopeCreated 信息 TransactionScopeResult,可为以下各项:

新交易
- 交易已通过。
- 已传递的依赖事务。
- 使用当前事务。
- 无交易。

新的当前 TransactionTraceId
TransactionScopeDisposed 信息 范围的“预计”当前事务的 TransactionTraceId。
事务范围不完整 警告 范围的“预计”当前事务的 TransactionTraceId。
TransactionScopeNestedIn 正确 警告 范围的“预计”当前事务的 TransactionTraceId。
TransactionScopeCurrentTransactionChanged 警告 旧的当前 TransactionTraceId、其他 TransactionTraceId
TransactionScopeTimeout 警告 范围的“预计”当前事务的 TransactionTraceId。
DependentCloneCreated 信息 TransactionTraceId、已创建的依赖事务的类型 (RollbackIfNotComplete/BlockCommitUntilComplete)
DependentCloneComplete 信息 交易跟踪标识符
恢复完成 信息 资源管理器 GUID(来自基类型)
重新入伍 信息 资源管理器 GUID(来自基类型)
TransactionSerialized 信息 TransactionTraceId。
TransactionException 错误 异常消息
InvalidOperationException 错误 异常消息
内部错误 危急 异常消息
TransferEvent 当事务被反序列化或从 System.Transactions 事务提升为分布式事务时,将记录当前执行上下文中的 ActivityID 和分布式事务的 ID。

当 DTC 回调到托管代码中时,分布式事务 ID 会在回调期间设置为 ExecutionContext 中的 ActivityID。
ConfiguredDefaultTimeoutAdjusted 警告 无额外数据
TransactionTimeout 警告 正在超时的事务的 TransactionTraceId。

上述每个额外数据项的 XML 架构具有以下格式。

交易跟踪标识符

<TransactionTraceIdentifier>

<TransactionIdentifier >

string representation of transaction id

</TransactionIdentifier>

< CloneIdentifier >

the clone id number

</CloneIdentifier>

</TransactionTraceIdentifier>

EnlistmentTraceIdentifier

<EnlistmentTraceIdentifier>

<ResourceManagerId>

string form of guid

</ResourceManagerId>

<TransactionTraceIdentifier>

<TransactionIdentifier >

string representation of transaction id

</TransactionIdentifier>

<CloneIdentifier >

the clone id number

</CloneIdentifier>

<TransactionTraceIdentifier>

<EnlistmentIdentifier>

the enlistment id number

</EnlistmentIdentifier>

</EnlistmentTraceIdentifier>

资源管理器标识符

<ResourceManagerId>

string form of guid

</ResourceManagerId>

跟踪的安全问题

当管理员启用跟踪时,敏感信息可能会写入默认可公开查看的跟踪日志。 若要缓解任何可能的安全威胁,应考虑将跟踪日志存储在共享和文件系统访问权限控制的安全位置。