本主題描述如何啟用追蹤、設定追蹤來源來發出追蹤和設定追蹤層級、設定活動追蹤和傳播以支援端對端追蹤相互關聯,以及設定追蹤接聽程式來存取追蹤。
如需生產環境或偵錯環境中的追蹤設定建議,請參閱 追蹤和訊息記錄的建議設定。
這很重要
在 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:一般記錄檔系統 (CLFS) 的 .NET Framework 介面記錄。
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 追蹤來源的設定所控制。 下表說明可用的追蹤層級。
| 追蹤層級 | 追蹤事件的性質 | 追蹤事件的內容 | 追蹤的事件 | 用戶目標 |
|---|---|---|---|---|
| 關閉 | N/A | N/A | 不會發出任何痕跡。 | N/A |
| 危急 | 「負面」事件:表示非預期處理或錯誤狀況的事件。 | 記錄未處理的例外,包括下列例外: - 記憶體不足錯誤 (OutOfMemoryException) - ThreadAbortException (CLR 會叫用任何 ThreadAbortExceptionHandler) - StackOverflowException (無法攔截) - ConfigurationErrorsException (設定錯誤異常) - SEHException - 應用程式啟動錯誤 - "Failfast" 事件 - 系統停止回應 - 有害訊息:導致應用程式失敗的訊息追蹤。 |
管理員 應用程式開發人員 |
|
| 錯誤 | 「負面」事件:表示非預期處理或錯誤狀況的事件。 | 發生未預期的處理。 應用程式無法如預期般執行工作。 不過,應用程式仍會啟動並執行。 | 系統會記錄所有例外狀況。 | 管理員 應用程式開發人員 |
| 警告 | 「負面」事件:表示非預期處理或錯誤狀況的事件。 | 發生或可能發生問題,但應用程式仍可正常運作。 不過,它可能無法繼續正常運作。 | - 應用程式收到的要求超過其節流設定允許的要求。 - 接收佇列接近其設定容量上限。 - 逾時已超過。 - 認證遭到拒絕。 |
管理員 應用程式開發人員 |
| 資訊 | 「正面」事件:標示成功里程碑的事件 | 應用程式執行的重要和成功里程碑,不論應用程式是否正常運作。 | 一般而言,會產生有助於監視和診斷系統狀態、測量效能或分析的訊息。 您可以使用這類資訊來進行容量規劃和效能管理: - 頻道已建立。 - 建立端點監聽器。 - 訊息輸入/離開傳輸。 安全性令牌已被擷取。 - 已讀取組態設定。 |
管理員 應用程式開發人員 產品開發人員。 |
| 詳細資訊 | 「正面」事件:標記成功里程碑的事件。 | 會發出低階事件,針對使用者程式碼與維護。 | 一般而言,您可以使用這個層級進行偵錯或應用程式優化。 已理解的訊息標頭。 |
管理員 應用程式開發人員 產品開發人員。 |
| 活動追蹤 | 處理活動和元件之間的流程事件。 | 此層級可讓系統管理員和開發人員將相同應用程式域中的應用程式相互關聯: - 活動範圍的記錄,例如啟動/停止。 - 傳輸的追蹤。 |
全部 | |
| 全部 | 應用程式可以正常運作。 所有事件都會發出。 | 所有先前的事件。 | 全部 |
從 Verbose 到 Critical 的層級會堆疊在彼此之上,也就是說,每個追蹤層級都包含其上方的所有層級,但 [關閉] 層級除外。 例如,聆聽者在警告層級會收到嚴重、錯誤和警告的紀錄。 All 層級包括從 Verbose 到 Critical 的事件以及活動追蹤事件。
謹慎
Information、Verbose和ActivityTracing層級會產生許多追蹤,如果您已用盡機器上所有可用的資源,可能會對訊息吞吐量造成負面影響。
設定相互關聯的活動追蹤和傳播
為 activityTracingswitchValue 屬性指定的值是用來啟用活動追蹤能力,可以產生端點內的活動界限與轉移的追蹤記錄。
備註
當您在 WCF 中使用某些擴充功能時,啟用活動追蹤後可能會得到 NullReferenceException 。 若要修正此問題,請檢查應用程式的組態檔,並確定 switchValue 追蹤來源的 屬性未設定為 activityTracing。
屬性 propagateActivity 會指出活動是否應該傳播至參與訊息交換的其他端點。 將此值設定為 true,您可以擷取任何兩個端點所產生的追蹤檔案,並觀察一個端點上的一組追蹤如何流向另一個端點上的一組追蹤。
如需活動追蹤和傳播的詳細資訊,請參閱 傳播。
propagateActivity 和 ActivityTracing 布爾值都適用於 System.ServiceModel TraceSource。 值 ActivityTracing 也適用於任何追蹤來源,包括 WCF 或使用者定義來源。
您無法將 propagateActivity 屬性與使用者定義的追蹤來源搭配使用。 針對使用者程式代碼活動識別碼傳播,請確定您未設定 ServiceModel ActivityTracing,同時仍將 ServiceModel propagateActivity 屬性設定為 true。