다음을 통해 공유


워크플로에 대한 추적 구성

워크플로는 다음 세 가지 방법으로 실행할 수 있습니다.

워크플로 호스팅 옵션에 따라 코드 또는 구성 파일을 통해 추적 참가자를 추가할 수 있습니다. 이 항목에서는 WorkflowApplicationWorkflowServiceHost에 추적 참가자를 추가하여 추적을 구성하는 방법과 WorkflowInvoker 사용할 때 추적을 활성화하는 방법을 설명합니다.

워크플로 애플리케이션 추적 구성

워크플로는 클래스를 WorkflowApplication 사용하여 실행할 수 있습니다. 이 항목에서는 추적 참가자를 워크플로 호스트에 추가하여 .NET Framework 4.6.1 워크플로 애플리케이션에 대해 추적을 WorkflowApplication 구성하는 방법을 보여 줍니다. 이 경우 워크플로는 워크플로 애플리케이션으로 실행됩니다. 클래스를 사용하는 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 구현입니다. 이 섹션에서는 .NET Framework 4.6.1 워크플로 서비스에서 실행되는 WorkflowServiceHost추적을 구성하는 방법을 설명합니다. 서비스 동작을 지정하거나 서비스 호스트의 컬렉션에 추적 관련 동작 Behaviors 을 추가하여 코드를 통해 Web.config 파일(웹 호스팅 서비스) 또는 App.config 파일(콘솔 애플리케이션과 같은 독립 실행형 애플리케이션에서 호스트되는 서비스)을 통해 구성됩니다.

호스팅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. Microsoft, WindowsApplication Server-Applications 노드를 확장합니다.

  4. Application Server-Applications 노드에서 디버그 노드를 마우스 오른쪽 단추로 클릭하고 로그 사용을 선택합니다.

  5. 추적 사용 애플리케이션을 실행하여 추적 이벤트를 생성합니다.

  6. 디버그 노드를 마우스 오른쪽 단추로 클릭하고 새로 고침을 선택합니다. 추적 이벤트는 가운데 창에 표시됩니다.

WF 4는 ETW(Windows용 이벤트 추적) 세션에 추적 레코드를 쓰는 추적 참가자를 제공합니다. ETW 추적 참가자는 추적 레코드를 구독하도록 추적 프로필로 구성됩니다. 추적을 사용하도록 설정하면 오류 추적 레코드가 ETW로 내보내집니다. ETW 추적 참가자가 내보낸 추적 이벤트에 해당하는 ETW 추적 이벤트(100-113 범위 사이)는 분석 로그에 기록됩니다.

추적 레코드를 보려면 다음 단계를 수행합니다.

  1. 이벤트 뷰어를 열려면 시작을 클릭한 다음 실행을 클릭합니다. 실행 대화 상자에서 .를 입력합니다 eventvwr.

  2. 이벤트 뷰어 대화 상자에서 애플리케이션 및 서비스 로그 노드를 확장합니다 .

  3. Microsoft, WindowsApplication Server-Applications 노드를 확장합니다.

  4. 애플리케이션 서버-애플리케이션 노드에서 분석 노드를 마우스 오른쪽 단추로 클릭하고 로그 사용을 선택합니다.

  5. 추적 지원 애플리케이션을 실행하여 추적 레코드를 생성합니다.

  6. 분석 노드를 마우스 오른쪽 단추로 클릭하고 새로 고침을 선택합니다. 추적 레코드는 가운데 창에 표시되어야 합니다.

다음 이미지는 이벤트 뷰어의 추적 이벤트를 보여 줍니다.

추적 레코드를 보여 주는 이벤트 뷰어의 스크린샷

애플리케이션별 공급자 ID 등록

특정 애플리케이션 로그에 이벤트를 기록해야 하는 경우 다음 단계에 따라 새 공급자 매니페스트를 등록합니다.

  1. 애플리케이션 구성 파일에서 공급자 ID를 선언합니다.

    <system.serviceModel>
        <diagnostics etwProviderId="2720e974-9fe9-477a-bb60-81fe3bf91eec"/>
    </system.serviceModel>
    
  2. %windir%\Microsoft.NET\Framework\<최신 버전의 .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. 매니페스트 파일 Microsoft.Windows.ApplicationServer.Applications.Provider1.man 의 리소스 및 메시지 dll 이름을 새 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
      

참고하십시오