ASP.NET Web API 2에서 추적

웹 기반 애플리케이션을 디버그하려는 경우 좋은 추적 로그 집합을 대체할 수 없습니다. 이 자습서에서는 ASP.NET Web API 추적을 사용하도록 설정하는 방법을 보여 줍니다. 이 기능을 사용하여 웹 API 프레임워크가 컨트롤러를 호출하기 전과 후에 수행하는 작업을 추적할 수 있습니다. 사용자 고유의 코드를 추적하는 데 사용할 수도 있습니다.

자습서에서 사용되는 소프트웨어 버전

Web API에서 System.Diagnostics 추적 사용

먼저 새 ASP.NET 웹 애플리케이션 프로젝트를 만듭니다. Visual Studio의 파일 메뉴에서 >프로젝트를 선택합니다. 템플릿, 에서 ASP.NET 웹 애플리케이션을 선택합니다.

새 프로젝트 대화 상자 이미지

Web API 프로젝트 템플릿을 선택합니다.

선택한 웹 API 이미지

도구 메뉴에서 NuGet 패키지 관리자, 패키지 관리 콘솔을 차례로 선택합니다.

패키지 관리자 콘솔 창에서 다음 명령을 입력합니다.

Install-Package Microsoft.AspNet.WebApi.Tracing
Update-Package Microsoft.AspNet.WebApi.WebHost

첫 번째 명령은 최신 Web API 추적 패키지를 설치합니다. 또한 핵심 Web API 패키지를 업데이트합니다. 두 번째 명령은 WebApi.WebHost 패키지를 최신 버전으로 업데이트합니다.

참고

특정 버전의 Web API를 대상으로 지정하려면 추적 패키지를 설치할 때 -Version 플래그를 사용합니다.

App_Start 폴더에서 WebApiConfig.cs 파일을 엽니다. Register 메서드에 다음 코드를 추가합니다.

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // New code
        config.EnableSystemDiagnosticsTracing();

        // Other configuration code not shown.
    }
}

이 코드는 SystemDiagnosticsTraceWriter 클래스를 Web API 파이프라인에 추가합니다. SystemDiagnosticsTraceWriter 클래스는 System.Diagnostics.Trace에 추적을 씁니다.

추적을 보려면 디버거에서 애플리케이션을 실행합니다. 브라우저에서 /api/values으로 이동합니다.

수정된 U R L을 표시하는 이미지

추적 문은 Visual Studio의 출력 창에 기록됩니다. 보기 메뉴에서출력을 선택합니다.

추적 문의 이미지

SystemDiagnosticsTraceWriter는System.Diagnostics.Trace에 추적을 기록하므로 추가 추적 수신기를 등록할 수 있습니다. 예를 들어 로그 파일에 추적을 씁니다. 추적 작성기에 대한 자세한 내용은 MSDN의 추적 수신기 항목을 참조하세요.

SystemDiagnosticsTraceWriter 구성

다음 코드에서는 추적 기록기를 구성하는 방법을 보여 있습니다.

SystemDiagnosticsTraceWriter traceWriter = config.EnableSystemDiagnosticsTracing();
traceWriter.IsVerbose = true;
traceWriter.MinimumLevel = TraceLevel.Debug;

제어할 수 있는 두 가지 설정이 있습니다.

  • IsVerbose: false이면 각 추적에 최소한의 정보가 포함됩니다. true이면 추적에 추가 정보가 포함됩니다.
  • MinimumLevel: 최소 추적 수준을 설정합니다. 추적 수준은 순서대로 디버그, 정보, 경고, 오류 및 치명적입니다.

Web API 애플리케이션에 추적 추가

추적 기록기를 추가하면 Web API 파이프라인에서 만든 추적에 즉시 액세스할 수 있습니다. 추적 기록기를 사용하여 사용자 고유의 코드를 추적할 수도 있습니다.

using System.Web.Http.Tracing;

public class ProductsController : ApiController
{
    public HttpResponseMessage GetAllProducts()
    {
        Configuration.Services.GetTraceWriter().Info(
            Request, "ProductsController", "Get the list of products.");

        // ...
    }
}

추적 기록기를 얻으려면 HttpConfiguration.Services.GetTraceWriter를 호출합니다. 컨트롤러에서 이 메서드는 ApiController.Configuration 속성을 통해 액세스할 수 있습니다.

추적을 작성하려면 ITraceWriter.Trace 메서드를 직접 호출할 수 있지만 ITraceWriterExtensions 클래스는 좀 더 친숙한 일부 확장 메서드를 정의합니다. 예를 들어 위에 표시된 Info 메서드는 추적 수준 Info를 사용하여 추적 만듭니다.

Web API 추적 인프라

이 섹션에서는 Web API에 대한 사용자 지정 추적 작성기를 작성하는 방법을 설명합니다.

Microsoft.AspNet.WebApi.Tracing 패키지는 Web API의 보다 일반적인 추적 인프라를 기반으로 빌드됩니다. Microsoft.AspNet.WebApi.Tracing을 사용하는 대신 NLog 또는 log4net과 같은 다른 추적/로깅 라이브러리를 연결할 수도 있습니다.

추적을 수집하려면 ITraceWriter 인터페이스를 구현합니다. 다음은 간단한 예제입니다.

public class SimpleTracer : ITraceWriter
{
    public void Trace(HttpRequestMessage request, string category, TraceLevel level, 
        Action<TraceRecord> traceAction)
    {
        TraceRecord rec = new TraceRecord(request, category, level);
        traceAction(rec);
        WriteTrace(rec);
    }

    protected void WriteTrace(TraceRecord rec)
    {
        var message = string.Format("{0};{1};{2}", 
            rec.Operator, rec.Operation, rec.Message);
        System.Diagnostics.Trace.WriteLine(message, rec.Category);
    }
}

ITraceWriter.Trace 메서드는 추적을 만듭니다. 호출자는 범주 및 추적 수준을 지정합니다. 범주는 사용자 정의 문자열일 수 있습니다. Trace 구현은 다음을 수행해야 합니다.

  1. TraceRecord를 만듭니다. 표시된 것처럼 요청, 범주 및 추적 수준으로 초기화합니다. 이러한 값은 호출자가 제공합니다.
  2. traceAction 대리자를 호출합니다. 이 대리자 내에서 호출자는 TraceRecord의 나머지 부분을 채울 것으로 예상됩니다.
  3. 원하는 로깅 기술을 사용하여 TraceRecord를 작성합니다. 여기에 표시된 예제는 단순히 System.Diagnostics.Trace를 호출합니다.

추적 기록기 설정

추적을 사용하도록 설정하려면 ITraceWriter 구현을 사용하도록 Web API를 구성해야 합니다. 다음 코드와 같이 HttpConfiguration 개체를 통해 이 작업을 수행합니다.

public static void Register(HttpConfiguration config)
{
    config.Services.Replace(typeof(ITraceWriter), new SimpleTracer());
}

하나의 추적 기록기만 활성화할 수 있습니다. 기본적으로 Web API는 아무 작업도 수행하지 않는 "no-op" 추적기를 설정합니다. 추적 코드가 추적을 작성하기 전에 추적 기록기가 null인지 여부를 검사 필요가 없도록 "no-op" 추적자가 있습니다.

Web API 추적 작동 방식

Web API에서 추적은 외관 패턴을 사용합니다. 추적을 사용하도록 설정하면 Web API는 추적 호출을 수행하는 클래스를 사용하여 요청 파이프라인의 다양한 부분을 래핑합니다.

예를 들어 컨트롤러를 선택할 때 파이프라인은 IHttpControllerSelector 인터페이스를 사용합니다. 추적을 사용하도록 설정하면 파이프라인은 IHttpControllerSelector 를 구현하지만 실제 구현을 통해 를 호출하는 클래스를 삽입합니다.

Web API 추적은 외관 패턴을 사용합니다.

이 디자인의 이점은 다음과 같습니다.

  • 추적 기록기를 추가하지 않으면 추적 구성 요소가 인스턴스화되지 않으며 성능에 영향을 주지 않습니다.
  • IHttpControllerSelector와 같은 기본 서비스를 사용자 지정 구현으로 바꾸는 경우 래퍼 개체에 의해 추적이 수행되므로 추적은 영향을 받지 않습니다.

기본 ITraceManager 서비스를 대체하여 전체 Web API 추적 프레임워크를 사용자 고유의 사용자 지정 프레임워크로 바꿀 수도 있습니다.

config.Services.Replace(typeof(ITraceManager), new MyTraceManager());

ITraceManager.Initialize를 구현하여 추적 시스템을 초기화합니다. 이는 Web API에 기본 제공되는 모든 추적 코드를 포함하여 전체 추적 프레임워크를 대체합니다.