次の方法で共有


ワークフローの追跡の構成

ワークフローは、次の 3 つの方法で実行できます。

ワークフロー ホスティング オプションに応じて、コードまたは構成ファイルを使用して追跡参加要素を追加できます。 このトピックでは、追跡参加要素を WorkflowApplicationWorkflowServiceHostに追加して追跡を構成する方法と、 WorkflowInvokerを使用するときに追跡を有効にする方法について説明します。

ワークフロー アプリケーション追跡の構成

ワークフローは、 WorkflowApplication クラスを使用して実行できます。 このトピックでは、追跡参加要素を WorkflowApplication ワークフロー ホストに追加することで、.NET Framework 4.6.1 ワークフロー アプリケーションに対して追跡を構成する方法について説明します。 この場合、ワークフローはワークフロー アプリケーションとして実行されます。 ワークフロー アプリケーションは、 WorkflowApplication クラスを使用したセルフホステッド .exe ファイルである (構成ファイルを使用するのではなく) コードを使用して構成します。 追跡参加要素は、 WorkflowApplication インスタンスに拡張機能として追加されます。 これを行うには、WorkflowApplication インスタンスの拡張機能コレクションに TrackingParticipant を追加します。

ワークフロー アプリケーションの場合は、次のコードに示すように、 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 実装です。 このセクションでは、 WorkflowServiceHostで実行されている .NET Framework 4.6.1 ワークフロー サービスの追跡を構成する方法について説明します。 これは、サービスの動作を指定するか、サービス ホストの Behaviors コレクションに追跡固有の動作を追加することによって、Web.config ファイル (Web ホステッド サービス用) または App.config ファイル (コンソール アプリケーションなど、スタンドアロン アプリケーションでホストされているサービスの場合) を使用して構成されます。

WorkflowServiceHostでホストされているワークフロー サービスの場合は、次の例に示すように、構成ファイルの<behavior>要素を使用してEtwTrackingParticipantを追加できます。

<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 インスタンスに拡張機能として追跡プロバイダーを追加します。 次のコード例は、 Custom Tracking サンプルのコード例です。

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

イベント ビューアーでの追跡レコードの表示

WF の実行を追跡するときに表示するイベント ビューアー ログには、分析ログとデバッグ ログの 2 つがあります。 どちらも Microsoft の下にあります|Windows|アプリケーション Server-Applications ノード。 このセクション内のログには、システム全体に影響を与えるイベントではなく、1 つのアプリケーションからのイベントが含まれています。

デバッグ トレース イベントはデバッグ ログに書き込まれます。 イベント ビューアーで WF デバッグ トレース イベントを収集するには、デバッグ ログを有効にします。

  1. イベント ビューアーを開くには、[ スタート] をクリックし、[実行] をクリックします [実行] ダイアログで、「 eventvwr」と入力します。

  2. [イベント ビューアー] ダイアログで、[ アプリケーションとサービス ログ ] ノードを展開します。

  3. MicrosoftWindowsおよび Application Server-Applications ノードを展開します。

  4. [アプリケーション サーバーアプリケーション] ノードの下にある [デバッグ] ノードを右クリックし、[ログの有効化] を選択します。

  5. トレースが有効なアプリケーションを実行して、トレース イベントを生成します。

  6. [デバッグ] ノードを右クリックし、[最新の情報に更新] を選択します。トレース イベントは中央のウィンドウに表示されます。

WF 4 には、ETW (Windows イベント トレーシング) セッションに追跡レコードを書き込む追跡参加要素が用意されています。 ETW 追跡参加要素は、追跡レコードをサブスクライブする追跡プロファイルで構成されます。 追跡を有効にすると、エラー追跡レコードが ETW に出力されます。 ETW 追跡参加要素によって出力される追跡イベントに対応する ETW 追跡イベント (100 ~ 113 の範囲) は、分析ログに書き込まれます。

追跡レコードを表示するには、次の手順に従います。

  1. イベント ビューアーを開くには、[ スタート] をクリックし、[実行] をクリックします [実行] ダイアログで、「 eventvwr」と入力します。

  2. [イベント ビューアー] ダイアログで、[ アプリケーションとサービス ログ ] ノードを展開します。

  3. MicrosoftWindowsおよび Application Server-Applications ノードを展開します。

  4. [Application Server-Applications] ノードの下の [分析] ノードを右クリックし、[ログの有効化] を選択します。

  5. 追跡対応アプリケーションを実行して追跡レコードを生成します。

  6. [分析] ノードを右クリックし、[最新の情報に更新] を選択します。追跡レコードは中央のウィンドウに表示されます。

次の図は、イベント ビューアーの追跡イベントを示しています。

追跡レコードを示すイベント ビューアーのスクリーンショット。

アプリケーション固有のプロバイダー ID の登録

イベントを特定のアプリケーション ログに書き込む必要がある場合は、次の手順に従って新しいプロバイダー マニフェストを登録します。

  1. アプリケーション構成ファイルでプロバイダー ID を宣言します。

    <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
      

こちらも参照ください