診斷追蹤
追蹤就是在應用程式執行期間,所產生的特定訊息之發行動作。 使用追蹤功能時,您必須具有收集和記錄所傳送訊息的機制。 追蹤訊息由「接聽項」負責接收。 接聽項的用途是收集、儲存和傳送追蹤訊息。 接聽項會將追蹤輸出導向至適當的目標,例如記錄檔、視窗或文字檔。
這類的接聽項,例如 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
設定來控制。 下表定義了與診斷追蹤訊息相關聯的層級。
追蹤層級 | 描述 |
---|---|
重大 | 已發生如下列所述的嚴重失敗情況: - 可以導致使用者功能立即喪失的錯誤。 - 需要管理員採取行動來避免功能喪失的事件。 - 程式碼停止回應。 - 此追蹤層級也可以提供足夠的內容來解譯其他關鍵追蹤。 如此便可協助找出導致嚴重失敗的作業序列。 |
錯誤 | 已經發生可導致使用者功能喪失的錯誤 (例如,無效的組態或網路行為)。 |
警告 | 存在一個可間接導致錯誤或嚴重失敗的狀況 (例如,配置失敗或到達上限)。 對使用者程式碼錯誤的正常處理 (例如,交易中止、逾時、驗證失敗) 也可能產生警告。 |
資訊 | 會產生對監控與診斷系統狀態、衡量效能,或描述分析有幫助的訊息。 這些訊息包含交易與登記存留期事件,例如正在建立或認可的交易、重要界限的跨越,或是重要資源的配置。 這時開發人員可以使用此類資訊來進行容量規劃與效能管理。 |
追蹤程式碼
下表列出由 System.Transactions 基礎結構所產生的追蹤程式碼。 資料表中包含的是追蹤程式碼識別碼、追蹤的 EventType 列舉層級,以及包含在 TraceRecord 中用於追蹤的額外資料。 此外,追蹤的對應追蹤層級也會儲存在 TraceRecord 中。
TraceCode | EventType | TraceRecord 中的額外資料 |
---|---|---|
TransactionCreated | 資訊 | TransactionTraceId |
TransactionPromoted | 資訊 | 本機 TransactionTraceId、Distributed TransactionTraceId |
EnlistmentCreated | 資訊 | TransactionTraceId、EnlistmentTraceId、EnlistmentType (永久性/變動性)、EnlistmentOptions |
EnlistmentCallbackNegative | 警告 | TransactionTraceId、EnlistmentTraceId、 回呼 (forcerollback/中止/indoubt) |
TransactionRollbackCalled | 警告 | TransactionTraceId |
TransactionAborted | 警告 | TransactionTraceId |
TransactionInDoubt | 警告 | TransactionTraceId |
TransactionScopeCreated | 資訊 | TransactionScopeResult,可能為下列各項: - 新交易。 - 交易已通過。 - 相依交易已通過。 - 使用目前交易。 - 無交易。 目前新 TransactionTraceId |
TransactionScopeDisposed | 資訊 | 範圍所預期目前交易的 TransactionTraceId。 |
TransactionScopeIncomplete | 警告 | 範圍所預期目前交易的 TransactionTraceId。 |
TransactionScopeNestedIncorrectly | 警告 | 範圍所預期目前交易的 TransactionTraceId。 |
TransactionScopeCurrentTransactionChanged | 警告 | 目前舊有 TransactionTraceId、其他 TransactionTraceId |
TransactionScopeTimeout | 警告 | 範圍所預期目前交易的 TransactionTraceId。 |
DependentCloneCreated | 資訊 | TransactionTraceId、所建立的相依交易型別 (RollbackIfNotComplete/BlockCommitUntilComplete) |
DependentCloneComplete | 資訊 | TransactionTraceId |
RecoveryComplete | 資訊 | 資源管理員 GUID (從基底) |
Reenlist | 資訊 | 資源管理員 GUID (從基底) |
TransactionSerialized | 資訊 | TransactionTraceId。 |
TransactionException | 錯誤 | 例外狀況訊息 |
InvalidOperationException | 錯誤 | 例外狀況訊息 |
InternalError | 重大 | 例外狀況訊息 |
TransferEvent | 當交易已還原序列化,或是由 System.Transactions 交易提升為分散式交易,則會寫入來自 ExecutionContext 與分散式交易識別碼的目前 ActivityID。 當 DTC 回呼 Managed 程式碼,分散式交易識別碼就會針對回呼的持續時間設為 ExecutionContext 中的 ActivityID。 |
|
ConfiguredDefaultTimeoutAdjusted | 警告 | 無額外的資料 |
TransactionTimeout | 警告 | 目前逾時的交易 TransactionTraceId。 |
每個前置額外資料項目的 XML 結構描述都具有下列格式。
TransactionTraceIdentifier
<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>
追蹤安全性問題
當您以管理員身分開啟追蹤功能時,敏感性資訊可能會寫入預設可公開檢視的追蹤記錄中。 為了緩和任何可能發生的安全性威脅,您應該考慮將追蹤記錄存放在由共用與檔案系統存取權限所控制的安全地點。