共用方式為


設定工作流程的追蹤

工作流程可以透過三種方式執行:

視工作流程裝載選項而定,追蹤參與者可以透過程式代碼或組態檔來新增。 本主題描述如何將追蹤參與者新增至 WorkflowApplicationWorkflowServiceHost,以及在使用 WorkflowInvoker 時如何啟用追蹤。

設定工作流程應用程式追蹤

工作流程可以使用 WorkflowApplication 類別來執行。 本主題示範如何將追蹤參與者新增至 WorkflowApplication 工作流程主機,為 .NET Framework 4.6.1 工作流程應用程式設定追蹤。 在此情況下,工作流程會以工作流程應用程式的形式執行。 您可以透過程式代碼設定工作流程應用程式(而不是使用組態檔),這是使用 WorkflowApplication 類別的自我裝載 .exe 檔案。 追蹤參與者會作為擴充套件加入到WorkflowApplication實例中。 這是透過將 TrackingParticipant 新增到 WorkflowApplication 實例的擴展集合來完成的。

針對工作流程應用程式,您可以如以下程式代碼所示,新增 EtwTrackingParticipant 行為延伸模組。

LogActivity activity = new LogActivity();

WorkflowApplication instance = new WorkflowApplication(activity);
EtwTrackingParticipant trackingParticipant =
    new EtwTrackingParticipant
{

        TrackingProfile = new TrackingProfile
           {
               Name = "SampleTrackingProfile",
               ActivityDefinitionId = "ProcessOrder",
               Queries = new WorkflowInstanceQuery
               {
                  States = { "*" }
              }
          }
       };
instance.Extensions.Add(trackingParticipant);

設定工作流程服務追蹤

工作流程在 WorkflowServiceHost 服務主機中裝載時,可以公開為 WCF 服務。 WorkflowServiceHost 是工作流程型服務的特製化 .NET ServiceHost 實作。 本節說明如何設定 .NET Framework 4.6.1 工作流程服務在 WorkflowServiceHost 執行時的追蹤。 其設定方式是透過 Web.config 檔案(適用於 Web 裝載的服務)或 App.config 檔案(針對裝載在獨立應用程式中的服務,例如控制台應用程式),藉由指定服務行為或透過程式代碼,將追蹤特定行為新增至 Behaviors 服務主機的集合。

在裝載於 WorkflowServiceHost 的工作流程服務中,您可以使用 EtwTrackingParticipant<behavior 元素於組態檔中新增 >,如下列範例所示。

<behaviors>
   <serviceBehaviors>
        <behavior>
          <etwTracking profileName="Sample Tracking Profile" />
        </behavior>
   </serviceBehaviors>
</behaviors>

或者,針對裝載於 的 WorkflowServiceHost工作流程服務,您可以透過程式代碼新增 EtwTrackingParticipant 行為延伸模組。 若要新增自定義追蹤參與者,請建立新的行為延伸模組,並將其新增至 , ServiceHost 如下列範例程式代碼所示。

備註

如果您想查看展示如何建立自定義行為元素並新增自定義追蹤參與者的範例程式碼,請參考追蹤範例。

ServiceHost svcHost = new ServiceHost(typeof(WorkflowService), new
                                 Uri("http://localhost:8001/Sample"));
EtwTrackingBehavior trackingBehavior =
    new EtwTrackingBehavior
    {
        ProfileName = "Sample Tracking Profile"
    };
svcHost.Description.Behaviors.Add(trackingBehavior);
svcHost.Open();

追蹤參與者會新增至工作流程服務主機作為行為的延伸模組。

下列範例程式代碼示範如何從組態檔讀取追蹤配置檔。

TrackingProfile GetProfile(string profileName, string displayName)
        {
            TrackingProfile trackingProfile = null;
            TrackingSection trackingSection = (TrackingSection)WebConfigurationManager.GetSection("system.serviceModel/tracking");
            if (trackingSection == null)
            {
                return null;
            }

            profileName ??= "";

            //Find the profile with the specified profile name in the list of profile found in config
            var match = from p in new List<TrackingProfile>(trackingSection.TrackingProfiles)
                        where (p.Name == profileName) && ((p.ActivityDefinitionId == displayName) || (p.ActivityDefinitionId == "*"))
                        select p;

            if (match.Count() == 0)
            {
                //return an empty profile
                trackingProfile = new TrackingProfile()
                {
                    ActivityDefinitionId = displayName
                };

            }
            else
            {
                trackingProfile = match.First();
            }

            return trackingProfile;

此範例程式代碼示範如何將追蹤配置檔新增至工作流程主機。

WorkflowServiceHost workflowServiceHost = serviceHostBase as WorkflowServiceHost;
if (null != workflowServiceHost)
{
    string workflowDisplayName = workflowServiceHost.Activity.DisplayName;
    TrackingProfile trackingProfile = GetProfile(this.profileName, workflowDisplayName);
    workflowServiceHost.WorkflowExtensions.Add(()  => new EtwTrackingParticipant {
        TrackingProfile = trackingProfile
    });
 }

備註

如需追蹤配置檔的詳細資訊,請參閱 追蹤配置檔

使用 WorkflowInvoker 設定追蹤

若要設定使用 WorkflowInvoker 執行的工作流程追蹤,請將追蹤提供者新增為 WorkflowInvoker 實例的延伸模組。 下列程式代碼範例來自 自定義追蹤 範例。

WorkflowInvoker invoker = new WorkflowInvoker(BuildSampleWorkflow());
invoker.Extensions.Add(customTrackingParticipant);
invoker.Invoke();

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

追蹤 WF 執行時,有兩個特別值得注意的事件檢視器記錄檔 - 分析記錄檔和偵錯記錄檔。 兩者都位於Microsoft|Windows|應用程式 Server-Applications 節點之下。 本節中的記錄包含來自單一應用程式的事件,而不是影響整個系統的事件。

偵錯追蹤事件會寫入偵錯記錄檔。 若要在事件查看器中收集 WF 偵錯追蹤事件,請啟用偵錯記錄檔。

  1. 若要開啟事件查看器,請按兩下 [ 開始],然後按兩下[ 執行]。 在 [執行] 對話框中, 輸入 eventvwr

  2. 在 [事件查看器] 對話框中,展開 [ 應用程式和服務記錄] 節點。

  3. 展開 MicrosoftWindowsApplication Server-Applications 節點。

  4. 以滑鼠右鍵按兩下 [應用程式伺服器應用程式] 節點下的 [偵錯] 節點,然後選取 [啟用記錄]。

  5. 執行已啟用追蹤的應用程式以產生追蹤事件。

  6. 以滑鼠右鍵按兩下 [ 偵錯] 節點,然後選取 [ 重新整理]。 追蹤事件應該會顯示在中央窗格中。

WF 4 提供追蹤參與者,將追蹤記錄寫入 ETW(Windows 事件追蹤)會話。 ETW 追蹤參與者會設定追蹤配置檔來訂閱追蹤記錄。 啟用追蹤功能時,系統會將錯誤追蹤記錄發送到 ETW。 ETW 追蹤事件(介於 100-113 之間)對應 ETW 追蹤參與者發出的追蹤事件,並寫入分析日誌。

若要檢視追蹤記錄,請遵循下列步驟。

  1. 若要開啟事件查看器,請按兩下 [ 開始],然後按兩下[ 執行]。 在 [執行] 對話框中, 輸入 eventvwr

  2. 在 [事件查看器] 對話框中,展開 [ 應用程式和服務記錄] 節點。

  3. 展開 MicrosoftWindowsApplication Server-Applications 節點。

  4. 以滑鼠右鍵按兩下 [應用程式伺服器應用程式] 節點下的 [分析] 節點,然後選取 [啟用記錄]。

  5. 執行已啟用追蹤的應用程式以產生追蹤記錄。

  6. 以滑鼠右鍵按兩下 [分析 ] 節點,然後選取 [ 重新整理]。 追蹤記錄應該會顯示在中央窗格中。

下圖顯示事件檢視器中的追蹤事件:

顯示追蹤記錄的事件查看器螢幕快照。

註冊應用程式特定的提供者識別碼

如果需要將事件寫入特定的應用程式記錄檔,請遵循下列步驟來註冊新的提供者指令清單。

  1. 在應用程式組態檔中宣告提供者標識碼。

    <system.serviceModel>
        <diagnostics etwProviderId="2720e974-9fe9-477a-bb60-81fe3bf91eec"/>
    </system.serviceModel>
    
  2. 將指令清單檔案從 %windir%\Microsoft.NET\Framework\<latest 版 .NET Framework 4.6.1>\Microsoft.Windows.ApplicationServer.Applications.man 複製到暫存位置,並將它重新命名為 Microsoft.Windows.ApplicationServer.Applications_Provider1.man

  3. 將清單檔中的 GUID 變更為新的 GUID。

    <provider name="Microsoft-Windows-Application Server-Applications" guid="{2720e974-9fe9-477a-bb60-81fe3bf91eec}" />
    
  4. 如果您不想卸載預設提供者,請變更提供者名稱。

    <provider name="Microsoft-Windows-Application Server-Applications" guid="{2720e974-9fe9-477a-bb60-81fe3bf91eec}" />
    
  5. 如果您在上一個步驟中變更提供者名稱,請將指令清單檔中的通道名稱變更為新的提供者名稱。

    <channel name="Microsoft-Windows-Application Server-Applications_Provider1/Admin" chid="ADMIN_CHANNEL" symbol="ADMIN_CHANNEL" type="Admin" enabled="false" isolation="Application" message="$(string.MICROSOFT_WINDOWS_APPLICATIONSERVER_APPLICATIONS.channel.ADMIN_CHANNEL.message)" />
    <channel name="Microsoft-Windows-Application Server-Applications_Provider1/Operational" chid="OPERATIONAL_CHANNEL" symbol="OPERATIONAL_CHANNEL" type="Operational" enabled="false" isolation="Application" message="$(string.MICROSOFT_WINDOWS_APPLICATIONSERVER_APPLICATIONS.channel.OPERATIONAL_CHANNEL.message)" />
    <channel name="Microsoft-Windows-Application Server-Applications_Provider1/Analytic" chid="ANALYTIC_CHANNEL" symbol="ANALYTIC_CHANNEL" type="Analytic" enabled="false" isolation="Application" message="$(string.MICROSOFT_WINDOWS_APPLICATIONSERVER_APPLICATIONS.channel.ANALYTIC_CHANNEL.message)" />
    <channel name="Microsoft-Windows-Application Server-Applications_Provider1/Debug" chid="DEBUG_CHANNEL" symbol="DEBUG_CHANNEL" type="Debug" enabled="false" isolation="Application" message="$(string.MICROSOFT_WINDOWS_APPLICATIONSERVER_APPLICATIONS.channel.DEBUG_CHANNEL.message)" />
    <channel name="Microsoft-Windows-Application Server-Applications_Provider1/Perf" chid="PERF_CHANNEL" symbol="PERF_CHANNEL" type="Analytic" enabled="false" isolation="Application" message="$(string.MICROSOFT_WINDOWS_APPLICATIONSERVER_APPLICATIONS.channel.PERF_CHANNEL.message)" />
    
  6. 依照下列步驟產生資源 DLL。

    1. 安裝 Windows SDK。 Windows SDK 包含訊息編譯程式 (mc.exe) 和資源編譯程式 (rc.exe)。

    2. 在 Windows SDK 命令提示字元中,在新指令清單檔案上執行 mc.exe。

      mc.exe Microsoft.Windows.ApplicationServer.Applications_Provider1.man
      
    3. 在上一個步驟中產生的資源檔上執行 rc.exe。

      rc.exe  Microsoft.Windows.ApplicationServer.Applications_Provider1.rc
      
    4. 建立名為 NewProviderReg.cs 的空白 cs 檔案。

    5. 使用 C# 編譯程式建立資源 DLL。

      csc /target:library /win32res:Microsoft.Windows.ApplicationServer.Applications_Provider1.res NewProviderReg.cs /out:Microsoft.Windows.ApplicationServer.Applications_Provider1.dll
      
    6. 將指令清單檔中的資源和訊息 dll 名稱從 Microsoft.Windows.ApplicationServer.Applications.Provider1.man 變更為新的 dll 名稱。

      <provider name="Microsoft-Windows-Application Server-Applications_Provider1" guid="{2720e974-9fe9-477a-bb60-81fe3bf91eec}" symbol="Microsoft_Windows_ApplicationServer_ApplicationEvents" resourceFileName="<dll directory>\Microsoft.Windows.ApplicationServer.Applications_Provider1.dll" messageFileName="<dll directory>\Microsoft.Windows.ApplicationServer.Applications_Provider1.dll" />
      
    7. 使用 wevtutil 註冊清單。

      wevtutil im Microsoft.Windows.ApplicationServer.Applications_Provider1.man
      

另請參閱