다음을 통해 공유


워크플로 추적 구성

이 항목은 Windows Workflow Foundation 4에 적용됩니다.

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

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

워크플로 응용 프로그램 추적 구성

WorkflowApplication 클래스를 사용하여 워크플로를 실행할 수 있습니다. 이 항목에서는 WorkflowApplication 워크플로 호스트에 추적 참가자를 추가하여 .NET Framework 버전 4 워크플로 응용 프로그램에 대해 추적을 구성하는 방법을 보여 줍니다. 이 경우 워크플로는 워크플로 응용 프로그램으로 실행됩니다. 구성 파일을 사용하는 대신 코드를 통해 워크플로 응용 프로그램을 구성하면 이 워크플로 응용 프로그램은 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 워크플로 서비스에 대해 추적을 구성하는 방법에 대해 설명합니다. 이러한 추적 기능은 Web.config 파일(웹 호스팅 서비스의 경우) 또는 App.config 파일(콘솔 응용 프로그램과 같은 독립 실행형 응용 프로그램에서 호스팅되는 서비스의 경우)을 통해 서비스 동작을 지정하거나, 코드를 통해 서비스 호스트에 대한 Behaviors 컬렉션에 추적별 동작을 추가하여 구성됩니다.

WorkflowServiceHost에서 호스팅되는 워크플로 서비스의 경우 다음 예제와 같이 구성 파일에서 <behavior> 요소를 사용하여 EtwTrackingParticipant를 추가할 수 있습니다.

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

또는 WorkflowServiceHost에서 호스팅되는 워크플로 서비스의 경우 코드를 통해 EtwTrackingParticipant 동작 확장을 추가할 수 있습니다. 사용자 지정 추적 참가자를 추가하려면 다음 예제 코드와 같이 새 동작 확장을 만들어 ServiceHost에 추가합니다.

Ee517415.note(ko-kr,VS.100).gif참고:
사용자 지정 추적 참가자를 추가하는 사용자 지정 동작 요소를 만드는 방법을 보여 주는 샘플 코드를 보려면 추적 샘플을 참조하십시오.

ServiceHost svcHost = new ServiceHost(typeof(WorkflowService), new 
                                 Uri("https://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;
            }

            if (profileName == 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();

이벤트 뷰어에서 추적 레코드 보기

EtwTrackingParticipant 확장을 사용하면 추적 레코드가 Microsoft, Windows 및 응용 프로그램 서버-응용 프로그램 노드의 분석 로그에 나타납니다. 추적 레코드를 보려면 아래 단계를 따릅니다.

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

  2. 이벤트 뷰어 대화 상자에서 응용 프로그램 및 서비스 로그 노드를 확장합니다.

  3. Microsoft, Windows응용 프로그램 서버-응용 프로그램 노드를 확장합니다.

  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>\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