추적

 

롭 하워드
Microsoft Corporation

2001년 1월 25일

ASP.NET 프레젠테이션을 할 때마다 새로운 추적 기능이 시연될 때 청중을 watch 것이 항상 재미있습니다. ASP를 사용하여 솔루션을 구축 한 사람들을 위해 추적은 신의 선물입니다!

이번 달 열에서는 ASP.NET 추적 기능을 살펴보겠습니다. 먼저 ASP, Response.Write()에 대한 일반적인 추적 기술에 대해 설명해 보겠습니다.

ASP를 사용하여 추적

나 같은 경우 ASP 애플리케이션을 코딩할 때 코드의 번거로운 섹션을 해부할 때 Response.Write() 문을 사용합니다.

이 점을 설명하는 몇 가지 의사 코드는 다음과 같습니다.

<%
On Error Resume Next 
Response.Write("About to do data access...")
Set objDB = Server.CreateObject("Custom.DataAccess")
objDB.Open("PersonalizationData")
user = objDB.Get("username")
Response.Write("Done calling data access. Value of username is:" + user)
%>

위의 코드에서 Response.Write() 호출은 매우 친숙해 보일 것입니다. 즉, 코드 동작에 오류가 있습니다. 오류는 반드시 애플리케이션 또는 시스템 오류(예: 개체 로드 실패)가 아니라 코드가 예상대로 실행되지만 예상 값을 반환하지 않는 코딩 오류입니다.

물론 디버거를 사용할 수도 있지만, 경우에 따라 추적 출력을 가져와 코드가 수행하는 작업을 확인하거나 코드의 특정 섹션이 실행되는 방법을 알려 주는 것이 더 빠릅니다.

Repsonse.Write() 문을 사용하면 애플리케이션을 쉽게 디버그할 수 있지만 애플리케이션에 불필요한 코드를 도입하여 배포된 애플리케이션을 중단시키는 실제 버그가 발생할 수 있습니다. 예를 들어 작업 중인 코드에 대한 진정한 감정을 표현할 수 있는 보다 다채로운 Response.Write() 문을 제거하는 것을 잊어버린 경우에는 일반적으로 좋은 것으로 간주되지 않습니다.

물론 Response.Write() 문의 동일한 기능은 ASP.NET 내에서 지원됩니다. 실제로 추적 기능이 있지만 여전히 Response.Write() 를 사용하고 있습니다. 오래된 습관은 깨기 어렵다.

그러나 새로운 추적 기능은 ASP: 디버그 모드에 존재하지 않는 항목을 제공하기 때문에 이러한 오래된 습관을 깨려고 노력해야 합니다.

ASP.NET 사용하여 추적

ASP.NET 새로운 추적 기능을 사용하면 Response.Write() 문을 시뮬레이션할 수 있지만 애플리케이션을 배포하기 전에 문을 제거할 필요가 없습니다. 대신 위와 동일한 코드를 작성하지만 Response.Write()를 사용하는 대신 Trace.Write()를 사용합니다.

Trace 개체는 이제 Request, Response, Server 등과 유사한 내장 페이지 개체입니다. 페이지 코드를 사용하여 직접 액세스할 수 있습니다.

Trace 클래스를 간략하게 살펴보겠습니다.

Trace 클래스

추적 은 ASP.NET 페이지 내에서 공용 속성으로 노출됩니다. Trace 속성을 사용하는 경우 System.Web 네임스페이스에 정의된 TraceContext 클래스의 instance 사용합니다.

Trace 클래스는 오버로드된 두 메서드와 두 개의 속성을 노출합니다. 두 메서드 Warn()Write(), 둘 다 동일한 두 프로토타입을 지원합니다.

VB.NET

Public Sub [Warn | Write](category As String, 
                          message As String, 
                          errorInfo As Exception)
End Sub
Public Sub [Warn | Write](category As String, 
                          message As String)
End Sub

C#

public void [Warn | Write](String category, 
                           String message, 
                           Exception errorInfo)
public void [Warn | Write](String category, 
                           String message)

category 매개 변수는 메시지 값을 쓸 범주 이름을 식별하는 데 사용됩니다. 아래 예제에서 Write() 메서드를 사용할 때 이 방법이 더욱 분명해집니다. Warn ()Write() 가 오버로드된 메서드에서 지원하는 세 번째 매개 변수는 errorInfo입니다. 이렇게 하면 예외 세부 정보를 추적 시스템에 전달할 수 있습니다.

속성

TraceContext 클래스는 IsEnabledTraceMode라는 두 개의 공용 속성을 지원합니다.

  • IsEnabled 는 페이지에서 또는 애플리케이션에 대해 추적을 사용할 수 있는지 여부를 나타냅니다.
  • TraceMode 는 추적에서 사용하는 정렬 모드를 설정하거나 반환합니다. 아래에서 애플리케이션 수준 추적에 대해 논의할 때 추적 모드를 구성하는 방법을 살펴보겠습니다.

이제 TraceContext 클래스에서 지원하는 클래스와 메서드 및 속성이 어떻게 표시되는지 살펴보았으므로 Trace.Write()의 예를 살펴보겠습니다.

<Script runat=server>
Public Function Add(a As Integer, b As Integer) As Integer
  Trace.Write("Inside Add() a: ", a.ToString())
  Trace.Write("Inside Add() b: ", b.ToString())
  return a + b
End Function
</Script>
Call the Add routine: 4 + 5 = <%=Add(4,5)%>

이 코드가 실행되면 출력은 다음과 같습니다.

그림 1. Trace.Write() 메서드의 예

분명히 Add() 메서드가 호출되고 있습니다. 그러나 Repsonse.Write() 문과 달리 Trace.Write() 문은 결과 출력 내에 나타나지 않습니다. Trace.Write() 문의 결과를 보려면 이 페이지 또는 애플리케이션에 대해 추적을 사용하도록 설정해야 합니다.

추적을 사용하도록 설정하려면 페이지 지시문 또는 구성 옵션을 사용할 수 있습니다. 둘 다 살펴보겠습니다.

페이지 추적 지시문

페이지 지시문은 ASP.NET ASP.NET 리소스에 대한 요청을 처리할 때 사용하는 특별한 지침입니다. 페이지 지시문을 사용하여 ASP.NET 페이지에 대한 구성 설정을 재정의하거나 적용할 수 있습니다.

지시문은 페이지의 첫 번째 요소여야 합니다. 다음 구문을 사용하여 선언됩니다.

<%@ Directive Attribute="[Value]" %>

위의 구문을 사용하여 페이지에서 추적을 사용하도록 설정하려는 ASP.NET 알려주는 방법은 다음과 같습니다.

<%@ Page Trace="true" %>

위의 지시문을 샘플 코드에 추가하면 페이지 출력이 약간 다르게 표시됩니다.

그림 2. 추적 사용

이제 페이지 아래쪽에 추적 출력이 추가됩니다. 추적 출력은 항상 페이지 끝에 추가됩니다.

다음으로, 애플리케이션 수준에서 추적을 사용하도록 설정하는 방법을 살펴보겠습니다. 그런 다음 추적 출력에 포함된 내용에 대해 설명합니다.

애플리케이션 추적

ASP.NET XML 구성 파일을 사용하여 ASP.NET 애플리케이션에 대한 구성 설정을 설정합니다. 모든 ASP.NET 설치는 [시스템 드라이브]\WinNt\Microsoft.NET\Framework\[version]\ 디렉터리 config.web에 구성 파일을 설치합니다.

구성 파일은 기본 ASP.NET 구성을 설정하고 베타 1에서는 루트 구성 파일이라고 합니다. 이 파일 내에서 변경한 내용은 모든 ASP.NET 웹 애플리케이션에 영향을 미칩니다. 웹 애플리케이션의 구성 파일을 사용하여 기본 config.web에서 가져온 설정을 추가하거나 제거할 수도 있습니다.

향후 열에서 구성에 대해 자세히 설명하겠습니다. 지금은 루트 구성 파일을 사용하여 모든 ASP.NET 애플리케이션에 대한 추적 설정을 적용합니다.

추적 섹션

루트 config.web 파일을 열면 추적 섹션을 찾을 수 있습니다.

<configuration>
    <trace
        enabled="false"
        requestlimit="10"
        pageoutput="false"
        tracemode="SortByTime"
    />
</configuration>

추적 요소에는 다음과 같은 네 가지 특성이 있습니다.

  • enabled = "[true/false]"- 사용 옵션을 true 또는 false로 설정할 수 있습니다. 추적은 애플리케이션 수준에서 사용하도록 설정되거나 애플리케이션 수준에서 사용하지 않도록 설정됩니다. enabled=false를 설정하면 앞에서 설명한 추적 지시문을 사용하여 페이지 추적이 계속 지원됩니다.
  • requestlimit = " [int]"- 애플리케이션별로 메모리에 캐시된 상태로 유지할 총 추적 요청 수입니다. 추적은 pageoutputfalse로 설정된 경우 추적 출력을 보는 데 사용되는 특수 리소스 Trace.axd를 표시합니다.
  • pageoutput = " [true/false]"- 구성 파일을 통해 추적을 사용하도록 설정하면 관리자는 각 페이지에서 추적을 사용하거나 사용하지 않도록 설정할 수 있습니다. pageoutput 추적을 사용하면 애플리케이션 내의 모든 페이지에 대한 추적 세부 정보를 사용할 수 있습니다. 그러나 애플리케이션 수준 추적을 계속 사용하도록 설정하는 동안 pageoutput 추적이 해제될 수 있습니다(true" 사용 = "). 이렇게 하면 추적 요청이 메모리에 유지되므로 trace.axd를 통해 사용할 수 있습니다. 이 요청은 일시적으로 살펴보겠습니다. 하지만 페이지의 출력 내에는 표시되지 않습니다.
  • tracemode = "[SortByTime | SortByCategory]"- tracemode 설정을 사용하면 추적 세부 정보 정보가 출력되는 방식을 제어할 수 있습니다. 데이터는 시간 또는 범주별로 정렬될 수 있습니다. 여기서 범주는 시스템에서 설정한 설정과 개발자가 사용하도록 설정된 Trace.Write() 설정 간에 구분됩니다. 예를 들어 샘플에서는 Trace.Write(Inside Add(") a:", a.ToString())Trace.Write(). 문의 첫 번째 매개 변수가 범주입니다. 이 경우 범주를 Inside Add() a:"" 정의했습니다. 범주(tracemode = "SortByCategory")를 기준으로 정렬한 경우 이 항목은 추적 출력에서 일반 페이지 함수가 호출되기 전에 정렬됩니다. 반면 시간별로 정렬하면 통화에 소요된 시간을 기준으로 정렬됩니다.

애플리케이션 추적 사용

위의 동일한 샘플 코드를 사용하여 페이지 지시문을 제거하고 추적 config.web 설정을 수정하여 동일한 기능을 사용하도록 설정할 수 있습니다.

<configuration>
    <trace
        enabled="true"
        requestlimit="10"
        pageoutput="true"
        tracemode="SortByTime"
    />
</configuration>

이제 샘플 애플리케이션을 호출하여 Page 지시문을 제거하고 동일한 출력을 가져올 수 있습니다.

그림 3. 추적 사용, Page 지시문 없음

그러나 앞에서 언급한 기능을 사용하려는 경우 추적을 사용하도록 설정하지만 페이지에서 출력을 사용하지 않도록 설정하려면 어떻게 해야 할까요?

<configuration>
    <trace
        enabled="true"
        requestlimit="10"
        pageoutput="false"
        tracemode="SortByTime"
    />
</configuration>

위의 구성 설정을 사용하여 샘플 애플리케이션을 요청한 경우 추적이 계속 사용하도록 설정되어 있지만 추적 출력은 표시되지 않습니다. 추적 출력을 보려면 trace.axd라는 특수 애플리케이션을 사용합니다.

Trace.axd

Trace.axd는 Http 처리기입니다. Http 처리기는 가장 기본적인 수준에서 요청/응답을 처리할 수 있는 코딩 옵션입니다. Http 처리기는 ISAPI 확장과 동일합니다. 그러나 ISAPI와 달리 모든 .NET 언어를 사용하여 작성할 수 있습니다. 이후 열에서 Http 처리기에 대해 자세히 설명하겠습니다.

Trace.axd는 애플리케이션 추적 세부 정보를 요청하는 데 사용할 수 있는 Http 처리기입니다. 요청되면 마지막 n개 요청의 추적 로그가 제공됩니다. n은 구성 파일에서 requestlimit="[int]"에 의해 설정된 값에 의해 결정됩니다.

trace.axd를 사용하려면 샘플 애플리케이션에 대한 요청이 수행된 것과 동일한 애플리케이션 디렉터리에서 trace.axd를 요청하기만 하면됩니다.

그림 4. 애플리케이션 추적 요청

스크린샷에서 볼 수 있듯이 볼 수 있는 추적 목록이 표시됩니다. 이러한 추적 보기는 페이지의 출력이 포함되지 않고 추적이 페이지에 추가하는 세부 정보와 동일합니다.

그림 5. 요청 세부 정보

추적을 구성하고 사용하는 방법을 살펴보았으므로 추적 출력에 대해 살펴보겠습니다.

추적 출력 해석

Trace.axd를 통해 또는 페이지에서 추적 보기에서 제공하는 출력은 6개의 세부 정보를 제공합니다.

  • 요청 세부 정보 - 세션 ID, 요청 시간, Http 요청 유형 및 Http 응답 상태 코드와 같은 기본 정보입니다.
  • 추적 정보 - 이 섹션에서는 범주 및 메시지의 테이블 보기를 제공합니다. 코드에서 Trace.Write() 문을 사용하는 경우 Trace.Write() 에서 허용하는 두 매개 변수는 각각 CategoryMessage 값으로 사용됩니다. 또한 첫 번째 바이트부터 마지막 바이트까지의 시간도 제공됩니다.
  • 제어 트리 - 이 열에서 아직 설명하지는 않았지만 ASP.NET 서버 컨트롤을 사용하여 애플리케이션을 선언적으로 빌드할 수 있도록 합니다. 컨트롤 트리 섹션에서는 페이지 내의 컨트롤에 대한 정보를 제공합니다. 컨트롤의 ID, 형식, 렌더링 크기 및 보기 상태 크기가 제공됩니다. 이 정보는 사용 중인 컨트롤과 관련 비용(렌더링 크기 및 뷰스테이트)에 대한 아이디어를 제공합니다.
  • 쿠키 컬렉션 - 클라이언트가 요청 헤더에서 보내는 모든 쿠키가 구문 분석되고 이름, 값 및 크기가 표시됩니다.
  • 헤더 컬렉션 - 클라이언트가 서버에 제공하는 Http 헤더가 이 섹션에서 제공됩니다. 이름/값을 나열하는 간단한 테이블입니다.
  • 서버 변수 - 서버 변수 섹션에는 서버 변수의 이름/값 쌍 테이블이 표시됩니다.

추적 사용

분명히 알 수 있듯이 추적은 웹 애플리케이션을 더 쉽게 개발할 수 있도록 설계된 강력한 새로운 ASP.NET 기능입니다. 그러나 추적을 사용해야 할 때와 사용하지 말아야 할 때 멘션 것이 가치가 있다고 생각했습니다.

배포된 애플리케이션

추적은 요청에 추가 오버헤드를 추가하며 배포된 애플리케이션에 대해 사용하도록 설정해서는 안 됩니다. 그러나 Trace.Write() 문은 추적을 사용하지 않을 때 무시되므로 에 남을 수 있습니다.

데이터를 캡처하려는 배포된 애플리케이션의 경우 System.Diagnostics 네임스페이스에 있는 클래스를 사용하는 것이 좋습니다. 이후 열에서 다루려고 하는 이러한 클래스를 사용하면 Windows 이벤트 로그에 직접 쓸 수 있습니다.

애플리케이션을 빌드할 때는 확실히 추적을 사용해야 하지만, 해당 Response.Write() 문을 제거한 것처럼 애플리케이션을 배포할 준비가 되면 사용하지 않도록 설정해야 합니다.

Trace.axd 사용 안 됨

프로덕션 웹 서버에 ASP.NET 설치한 경우 Trace.axd를 명시적으로 사용하지 않도록 설정하는 것이 좋습니다. 루트 config.web 파일을 열고 섹션을 찾은 <httphandlers> 다음 다음 항목을 추가합니다.

<configuration>
        <add verb="*" 
             path="trace.axd"
             type="System.Web.Handlers.TraceHandler" />
        <remove verb="*" path="trace.axd"/>
</configuration>

참고: 전체 <add/> 항목을 잘라낼 수도 있지만 <remove> 구성 파일에 코드를 남기고 trace.axd를 사용하지 않도록 설정하여 동일한 목표를 달성하기 때문에 옵션이 더 좋습니다. 이 해결은 ASP.NET 베타 2에서 해결됩니다.

요약

ASP.NET 추적 기능은 애플리케이션이 수행하는 작업을 추적하는 강력한 새로운 방법입니다. 이전에는 Response.Write() 문을 사용하여 애플리케이션이 실행될 때 추적했지만 이제 Trace.Write() 문을 사용하고 배포된 코드에 이러한 문을 남길 수 있습니다. 이로 인해 애플리케이션을 배포할 준비가 되면 코드를 제거하지 않으므로 버그가 줄어듭니다.

ASP.NET 리소스

마지막으로 사용할 수 있는 새로운 ASP.NET 리소스 중 일부를 호출하고 싶었습니다. 자세한 ASP.NET 리소스에 대해 알아보려면 을 방문 https://www.asp.net 하세요.

롭 하워드는 .NET Framework 팀의 ASP.NET 프로그램 매니저입니다. 그는 가족과 함께 어떤 여가 시간을 보내거나 워싱턴 동부에서 낚시를 합니다.