다음을 통해 공유


사용자 지정 추적

CustomTracking 샘플에서는 사용자 지정 추적 참가자를 만들고 추적 데이터의 내용을 콘솔에 쓰는 방법을 보여 줍니다. 또한 이 샘플은 사용자 정의 데이터로 채워진 CustomTrackingRecord 개체를 내보내는 방법을 보여 줍니다. 콘솔 기반 추적 참가자는 코드에서 만든 추적 프로필 개체를 사용하여 워크플로가 내보낸 TrackingRecord 개체를 필터링합니다.

샘플 세부 정보

WF(Windows Workflow Foundation)는 워크플로 인스턴스의 실행을 추적하는 추적 인프라를 제공합니다. 추적 런타임은 워크플로 수명 주기, 워크플로 활동의 이벤트 및 사용자 지정 추적 이벤트와 관련된 이벤트를 내보내는 워크플로 인스턴스를 구현합니다. 다음 표에서는 추적 인프라의 기본 구성 요소에 대해 자세히 설명합니다.

구성 요소 설명
런타임 추적 추적 레코드를 내보내는 인프라를 제공합니다.
참가자 추적 추적 레코드를 사용합니다. .NET Framework 4는 추적 레코드를 ETW(Windows용 이벤트 추적) 이벤트로 기록하는 추적 참가자와 함께 제공됩니다.
추적 프로필 추적 참가자가 워크플로 인스턴스에서 내보낸 추적 레코드의 하위 집합을 구독할 수 있도록 하는 필터링 메커니즘입니다.

다음 표에서는 워크플로 런타임에서 내보내는 추적 레코드에 대해 자세히 설명합니다.

추적 레코드 설명
워크플로 인스턴스 추적 레코드입니다. 워크플로 인스턴스의 수명 주기를 설명합니다. 예를 들어 워크플로가 시작되거나 완료되면 인스턴스 레코드가 내보내집니다.
활동 상태 추적 레코드입니다. 활동 실행 세부 사항. 이러한 레코드는 활동이 예약되었을 때, 완료되었을 때, 또는 오류가 발생했을 때와 같은 워크플로 작업의 상태를 나타냅니다.
책갈피 재개 기록입니다. 워크플로 인스턴스 내의 책갈피가 다시 시작될 때마다 내보내집니다.
사용자 지정 추적 레코드입니다. 워크플로 작성자가 사용자 지정 추적 레코드를 만들고 사용자 지정 작업 내에서 내보낼 수 있습니다.

추적 참가자는 추적 프로필을 사용하여 내보낸 TrackingRecord 개체의 하위 집합을 구독합니다. 추적 프로필에는 특정 추적 레코드 형식에 대한 구독을 허용하는 추적 쿼리가 포함되어 있습니다. 추적 프로필은 코드 또는 구성에서 지정할 수 있습니다.

사용자 지정 추적 참가자

추적 참가자 API를 사용하면 워크플로 런타임에서 내보낸 개체를 처리하는 TrackingRecord 사용자 지정 논리를 포함할 수 있는 사용자가 제공한 추적 참가자를 사용하여 추적 런타임을 확장할 수 있습니다.

사용자가 추적 참가자를 작성하려면 TrackingParticipant를 구현해야 합니다. 특히 사용자 지정 참가자가 Track 메서드를 구현해야 합니다. 워크플로 런타임에서 TrackingRecord가 발생할 때 이 메서드가 호출됩니다.

public abstract class TrackingParticipant
{
    protected TrackingParticipant();

    public virtual TrackingProfile TrackingProfile { get; set; }
    public abstract void Track(TrackingRecord record, TimeSpan timeout);
}

전체 추적 참가자는 ConsoleTrackingParticipant.cs 파일에 구현됩니다. 다음 코드 예제는 Track 사용자 지정 추적 참가자에 대 한 방법입니다.

protected override void Track(TrackingRecord record, TimeSpan timeout)
{
    ...
    WorkflowInstanceRecord workflowInstanceRecord = record as WorkflowInstanceRecord;
    if (workflowInstanceRecord != null)
    {
        Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
            " Workflow InstanceID: {0} Workflow instance state: {1}",
            record.InstanceId, workflowInstanceRecord.State));
    }

    ActivityStateRecord activityStateRecord = record as ActivityStateRecord;
    if (activityStateRecord != null)
    {
        IDictionary<String, object> variables = activityStateRecord.Variables;
        StringBuilder vars = new StringBuilder();

        if (variables.Count > 0)
        {
            vars.AppendLine("\n\tVariables:");
            foreach (KeyValuePair<string, object> variable in variables)
            {
                vars.AppendLine(String.Format(
                    "\t\tName: {0} Value: {1}", variable.Key, variable.Value));
            }
        }
        Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
            " :Activity DisplayName: {0} :ActivityInstanceState: {1} {2}",
                activityStateRecord.Activity.Name, activityStateRecord.State,
            ((variables.Count > 0) ? vars.ToString() : String.Empty)));
    }

    CustomTrackingRecord customTrackingRecord = record as CustomTrackingRecord;

    if ((customTrackingRecord != null) && (customTrackingRecord.Data.Count > 0))
    {
        ...
    }
    Console.WriteLine();

}

다음 코드 예제에서는 워크플로 호출자에 콘솔 참가자를 추가합니다.

ConsoleTrackingParticipant customTrackingParticipant = new ConsoleTrackingParticipant()
{
    ...
    // The tracking profile is set here, refer to Program.CS
...
}

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

사용자 지정 추적 레코드 내보내기

이 샘플에서는 사용자 지정 워크플로 작업에서 개체를 내보내는 기능도 보여 줍니다 CustomTrackingRecord.

다음 예제에서는 사용자 지정 작업 내에서 CustomTrackingRecord 개체를 발생시키는 방법을 보여 줍니다.

// Create the Custom Tracking Record
CustomTrackingRecord customRecord = new CustomTrackingRecord("OrderIn")
{
    Data =
    {
        {"OrderId", 200},
        {"OrderDate", "20 Aug 2001"}
    }
};

// Emit custom tracking record
context.Track(customRecord);

이 샘플을 사용하려면

  1. Visual Studio를 사용하여 CustomTrackingSample.sln 솔루션 파일을 엽니다.

  2. Ctrl+Shift+B를 눌러 솔루션을 빌드합니다.

  3. 솔루션을 실행하려면 Ctrl+F5를 누릅니다.

참고하십시오