追蹤參與者是可讓工作流程開發人員存取 TrackingRecord 物件並處理對象的擴充點。 .NET Framework 4.6.1 包含標準追蹤參與者,可將追蹤記錄寫入為 Windows 事件追蹤(ETW) 事件。 如果不符合您的需求,您也可以撰寫自定義追蹤參與者。
追蹤參與者
追蹤基礎結構允許對傳出追蹤記錄套用篩選,讓參與者可以訂閱記錄的子集。 套用篩選的方法是透過追蹤檔案設定。
.NET Framework 4.6.1 中的 Windows Workflow Foundation (WF) 提供追蹤參與者,可將追蹤記錄寫入 ETW 會話。 參與者是在工作流程服務上設定,方法是在組態檔中新增追蹤特定行為。 啟用 ETW 追蹤參與者可讓追蹤記錄在事件查看器中檢視。 以 ETW 為基礎的追蹤 SDK 範例是使用 ETW 型追蹤參與者熟悉 WF 追蹤的好方法。
ETW 追蹤參與者
.NET Framework 4.6.1 包含 ETW 追蹤參與者,可將追蹤記錄寫入 ETW 會話。 這會以非常有效率的方式完成,對應用程式的效能或伺服器的輸送量影響最小。 使用標準 ETW 追蹤參與者的優點是,可以使用 Windows 事件查看器中的其他應用程式和系統記錄來檢視它收到的追蹤記錄。
標準 ETW 追蹤參與者是在 Web.config 檔案中設定,如下列範例所示。
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<etwTracking profileName="Sample Tracking Profile"/>
</behavior>
</serviceBehaviors>
</behaviors>
<tracking>
<profiles>
<trackingProfile name="Sample Tracking Profile">
….
</trackingProfile>
</profiles>
</tracking>
</system.serviceModel>
</configuration>
備註
如果未指定名稱,例如僅有 trackingProfile 或 <etwTracking/>,則會使用 Machine.config 檔案中隨 .NET Framework 4.6.1 安裝的預設追蹤配置檔。
在 Machine.config 檔案中,預設追蹤配置檔會訂閱工作流程實例記錄和錯誤。
在 ETW 中,事件會透過提供者標識碼寫入 ETW 工作階段。 ETW 追蹤參與者所使用的提供者識別碼,用於將追蹤記錄寫入 ETW,並定義於 Web.config 檔案的診斷區段中(在 <system.serviceModel><diagnostics> 下)。 根據預設,ETW 追蹤參與者在未指定提供者時會使用預設提供者標識符,如下列範例所示。
<system.serviceModel>
<diagnostics etwProviderId="52A3165D-4AD9-405C-B1E8-7D9A257EAC9F" />
下圖顯示追蹤數據在 ETW 追蹤參與者中的流向流程。 追蹤資料到達 ETW 工作階段之後,即可透過數種方式加以存取。 存取這些事件的其中一個最有用方式是透過事件查看器,這是用來檢視應用程式和服務的記錄和追蹤的常見 Windows 工具。
追蹤參與者事件數據
追蹤參與者會將追蹤的事件數據序列化至 ETW 會話,格式為每個追蹤記錄一個事件。 事件是使用介於 100 到 199 範圍內的標識碼來識別。 如需追蹤參與者發出的追蹤事件記錄定義,請參閱 追蹤事件參考 主題。
ETW 事件的大小受限於 ETW 緩衝區大小或 ETW 事件的最大承載,限制條件是這兩者中的較小值。 如果事件的大小超過上述任一 ETW 限制,則會截斷事件,並以任意方式移除其內容。 不會選擇性地移除變數、自變數、註釋和自定義數據。 在截斷的情況下,不論造成事件大小超過 ETW 限制的值為何,都會截斷所有這些值。 移除的資料會取代為 <item>..<item>。
變數、自變數和自訂數據項中的複雜類型會使用 NetDataContractSerializer 類別串行化為 ETW 事件記錄。 這個類別包含在序列化 XML 資料流中的 CLR 型別資訊。
由於 ETW 限制而截斷負載數據,可能會導致重複的追蹤記錄傳送至 ETW 工作階段。 如果有多個會話正在監聽事件,且每個會話對這些事件的資料負載限制不同,就會發生此情況。
對於具有較低限制的會話,事件可能會遭到截斷。 ETW 追蹤參與者不了解監聽事件的會話數量;如果某個會話中的事件被截斷,則 ETW 參與者會重試傳送該事件一次。 在此情況下,已設定為接受較大負載大小的會話將會取得兩次事件(完整事件與截斷事件)。 藉由設定具有相同緩衝區大小限制的所有 ETW 工作階段,即可避免重複。
存取事件檢視器中 ETW 使用者的追蹤數據
由 ETW 追蹤參與者寫入 ETW 工作階段的事件可以透過事件查看器存取(使用預設提供者識別符時)。 這可讓您快速檢視工作流程發出的追蹤記錄。
備註
追蹤向 ETW 會話所發出的記錄事件使用事件識別碼範圍為 100 至 199。
啟用在事件查看器中檢視追蹤記錄
啟動事件檢視器 (EVENTVWR.EXE)
選取 [事件查看器]、[應用程式和服務記錄檔]、[Microsoft]、[Windows]、[應用程式伺服器應用程式]。
以滑鼠右鍵按下並確定已選取 [檢視]、[顯示分析和偵錯記錄 ]。 如果沒有,請選取它,讓複選標記出現在其旁邊。 這會顯示 分析、 效能和 偵錯 記錄。
在 分析 記錄上按滑鼠右鍵,然後選取「啟用記錄」。 記錄檔會存在於 %SystemRoot%\System32\Winevt\Logs\Microsoft-Windows-Application Server-Applications%4Analytic.etl 檔案中。
自訂追蹤參與者
追蹤參與者 API 允許使用使用者提供的追蹤參與者來擴充追蹤運行時間,其中包含自定義邏輯來處理工作流程運行時間發出的追蹤記錄。 若要撰寫自定義追蹤參與者,開發人員必須在 Track 類別中實作 TrackingParticipant 方法。 當工作流程運行時間發出追蹤記錄時,會呼叫這個方法。
追蹤參與者衍生自 類別 TrackingParticipant 。 系統提供的 EtwTrackingParticipant 針對每個接收到的追蹤記錄發出 Windows 事件追蹤 (ETW) 事件。 若要建立自定義追蹤參與者,會建立衍生自 TrackingParticipant的類別。 若要提供基本的追蹤功能,請覆寫Track。在運行時傳送追蹤記錄時會呼叫Track,並且可以用所需的方式加以處理。 在下列範例中,會定義自定義追蹤參與者類別,以將所有追蹤記錄發出至主控台視窗。 您也可以實作一個 TrackingParticipant 物件,透過其 BeginTrack 和 EndTrack 方法以異步方式處理追蹤記錄。
class ConsoleTrackingParticipant : TrackingParticipant
{
protected override void Track(TrackingRecord record, TimeSpan timeout)
{
if (record != null)
{
Console.WriteLine("=================================");
Console.WriteLine(record);
}
}
}
若要使用特定的追蹤參與者,請向您想要追蹤的工作流程實例註冊它,如下列範例所示。
myInstance.Extensions.Add(new ConsoleTrackingParticipant());
在下列範例中,建立了一個工作流程,該流程由一個包含Sequence活動的WriteLine活動組成。
ConsoleTrackingParticipant 被新增至擴充功能,並啟動工作流程。
Activity activity= new Sequence()
{
Activities =
{
new WriteLine()
{
Text = "Hello World."
}
}
};
WorkflowApplication instance = new WorkflowApplication(activity);
instance.Extensions.Add(new ConsoleTrackingParticipant());
instance.Completed = delegate(WorkflowApplicationCompletedEventArgs e)
{
Console.WriteLine("workflow instance completed, Id = " + instance.Id);
resetEvent.Set();
};
instance.Run();
Console.ReadLine();