共用方式為


追蹤參與者

追蹤參與者是可讓工作流程開發人員存取 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 追蹤提供者的追蹤數據流動。

追蹤參與者事件數據

追蹤參與者會將追蹤的事件數據序列化至 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。

啟用在事件查看器中檢視追蹤記錄

  1. 啟動事件檢視器 (EVENTVWR.EXE)

  2. 選取 [事件查看器]、[應用程式和服務記錄檔]、[Microsoft]、[Windows]、[應用程式伺服器應用程式]。

  3. 以滑鼠右鍵按下並確定已選取 [檢視]、[顯示分析和偵錯記錄 ]。 如果沒有,請選取它,讓複選標記出現在其旁邊。 這會顯示 分析效能偵錯 記錄。

  4. 分析 記錄上按滑鼠右鍵,然後選取「啟用記錄」。 記錄檔會存在於 %SystemRoot%\System32\Winevt\Logs\Microsoft-Windows-Application Server-Applications%4Analytic.etl 檔案中。

自訂追蹤參與者

追蹤參與者 API 允許使用使用者提供的追蹤參與者來擴充追蹤運行時間,其中包含自定義邏輯來處理工作流程運行時間發出的追蹤記錄。 若要撰寫自定義追蹤參與者,開發人員必須在 Track 類別中實作 TrackingParticipant 方法。 當工作流程運行時間發出追蹤記錄時,會呼叫這個方法。

追蹤參與者衍生自 類別 TrackingParticipant 。 系統提供的 EtwTrackingParticipant 針對每個接收到的追蹤記錄發出 Windows 事件追蹤 (ETW) 事件。 若要建立自定義追蹤參與者,會建立衍生自 TrackingParticipant的類別。 若要提供基本的追蹤功能,請覆寫Track。在運行時傳送追蹤記錄時會呼叫Track,並且可以用所需的方式加以處理。 在下列範例中,會定義自定義追蹤參與者類別,以將所有追蹤記錄發出至主控台視窗。 您也可以實作一個 TrackingParticipant 物件,透過其 BeginTrackEndTrack 方法以異步方式處理追蹤記錄。

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();

另請參閱