跟踪是指发布在执行应用程序期间生成的特定消息。 使用跟踪时,必须有一个机制来收集和记录发送的消息。 跟踪消息由侦听器来接收。 侦听器的目的是收集、存储和路由跟踪消息。 侦听器将跟踪输出定向到相应的目标,例如日志、窗口或文本文件。
启用跟踪时,会自动创建并初始化此类侦听器 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>
跟踪的安全问题
当管理员启用跟踪时,敏感信息可能会写入默认可公开查看的跟踪日志。 若要缓解任何可能的安全威胁,应考虑将跟踪日志存储在共享和文件系统访问权限控制的安全位置。