Programming/.NET

웹 애플리케이션의 추적기능은 성능및 디버깅을 위한 용도로 자주 사용됩니다.

 

우선 간단하게 특정 페이지에 대한 추적데이터를 보려면 Page 선언자에 Trace 속성을 true로 설정합니다.

 

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"

 Inherits="web_form_test.Default" Trace="true" TraceMode="SortByTime" %>

 

TraceMode는 추적정보를 Category순(SortByCategory)으로 보일지 실행시간순(SortByTime)으로 보일지를 지정하는 부분입니다.

 

페이지에 추적기능을 활성화하고나면 추적정보가 페이지에 보이게 되는데 이 추적정보는 오로지 현재 페이지를 출력하는것에만 관련된 정보입니다. 애플리케이션 전체에 대한 추적정보를 담아두려면 Web.config의 <system.web>섹션에서 trace 요소를 추가해야 합니다.

 

<trace enabled="true" pageOutput="true"/>

 

trace 요소에서 pageOutput을 true로 설정하면 페이지에 추적정보를 표시할때 렌더링되는 HTML요소는 모두 제거하고 오로지 추적정보만 표시하게 됩니다.

 

 

 

Request Details

세션및 인코딩 응답정보등을 반환합니다.

Trace Information

페이지 수명주기 동안의 실행시간을 반환합니다.

Control Tree

페이지에서 HTML로 렌더링하는데 사용된 컨트롤들에 크기정보를 반환합니다. 특히 ViewState와 ControlState는 패킷크기와 관련이 있으므로 이를 유심히 살펴봐야 합니다.

Session State

현재 사용자에 대한 세션상태를 표시합니다.

Application State

현재 사용중인 Application개체의 키/값과 타입을 표시합니다.

Request Cookies Collection

페이지 요청에 전달된 쿠키를 표시합니다.

Response Cookies Collection

페이지 반환해 전달된 쿠키를 표시합니다.

Response Headers Collection

페이지의 해더값을 표시합니다.

Form Collection

페이지의 Form데이터에 대한 키와 값을 표시합니다.

Querystring Collection

페이지 호출시 전달된 QueryString의 키와 값을 표시합니다.

Server Variables

웹애플리케이션및 브라우저에 대한 정보를 표시합니다.

 

앞서 Web.config에 trace요소를 추가하여 모든 페이지의 추적정보를 활성화 한다고 했는데 수집된 모든추적 정보를 확인해 보려면

 

http://localhost/rtrace.axd

 

형식으로 axd페이지를 호출합니다. 참고로 axd는 내부 처리기로서 실제 존재하는 페이지가 아닙니다.

 

호출한 페이지를 보시면 웹애플리케이션에 호출된 모든 항목과 결과값을 보여주고 있으며 ViewDetail을 클릭해 위와 같은 상세추적정보를 볼 수도 있습니다.

 

또한 페이지의 오른쪽 상단에는 Remaining: 8 이라는 내용이 보이는데 이것은 앞으로 추적정보를 수집할 요청이 8번 남았음을 의미합니다. 그러니까 남은 8번을 합해 요청이 10번 이루어지면 더이상 추적정보를 저장하지 않습니다.

 

추적정보를 계속 저장하려면 'clear current trace'를 클릭해 현재 저장된 추적정보를 삭제하면 됩니다. 만일 10번 이상에 대한 추적정보를 계속 저장하려면 trace요소의 requestLimit속성을 수정해 원하는 만큼의 저장횟수를 지정하면 됩니다. 다만 이 추적정보는 서버메모리에 저장되므로 이를 감안해 적절한 범위를 지정해야 합니다.(최대치 10,000)

 

만약 전체적인 추적정보가 아닌 최신의 추적정보만을 계속 유지하려면 mostRecent속성을 true로 설정하십시오. 이 속성은 제한된만큼의 추적정보를 저장했다가 초과하는 요청이 발생하면 가장 오래된 추적정보를 버리고 새로운 추적정보를 저장하게 됩니다.

 

이 외에도 직접 추적정보에 대한 내용을 추가하기 위해 Trace객체의 Write메소드를 사용할 수 있습니다.

 

Trace.Write("test");

 

Web.config에서 trace 요소의 writeToDiagnosticsTrace속성에 true를 설정하면 Trace.Write의 모든 메소드 호출은 System.Diagnostics.Trace.Write 메소드에 추적정보를 전달하게 됩니다. 그러면 추적정보와 관련된 다양한 클래스를 활용하여 추적정보를 수집할 수 있습니다.

 

우선 System.Diagnostics.Trace에 전달한 메세지는 TraceListeners개체 통해 일반 파일이나 DB쪽에 따로 저장해 둘 수 있습니다.

 

<system.diagnostics>
  <trace autoflush="true">
    <listeners>
      <add name="myListener" type="System.Diagnostics.TextWriterTraceListener"

 initializeData="C:\data\Log.txt"></add>
    </listeners>
  </trace>
</system.diagnostics>

 

TextWriterTraceListener클래스를 Web.config에 위와 같이 설정하면 C:\data에 Log.txt파일을 생성하여 추적정보를 남길 것입니다. 이 밖에 파일형태로 추적정보를 남기는

 

<system.diagnostics>
  <trace autoflush="true">
    <listeners>
      <add name="myListener" type="System.Diagnostics.XmlWriterTraceListener"

 initializeData="C:\data\Log.xml"></add>
    </listeners>
  </trace>
</system.diagnostics>

 

XmlWriterTraceLister 클래스는 XML형태로 추적정보를 남기며

 

<system.diagnostics>
  <trace autoflush="true">
    <listeners>
      <add name="myListener" type="System.Diagnostics.DelimitedListTraceListener"

 initializeData="C:\data\Log.csv"></add>
    </listeners>
  </trace>
</system.diagnostics>

 

DelimitedListTraceListener는 CSV 형식의 파일로 추적정보를 남깁니다.

 

<system.diagnostics>
  <trace autoflush="true">
    <listeners>
      <add name="myListener" type="System.Diagnostics.EventLogTraceListener"

 initializeData="cliel"></add>
    </listeners>
  </trace>
</system.diagnostics>

 

EventLogTraceListener클래스는 윈도우 이벤트로그에 추적정보를 남기도록 합니다. 다만 이벤트로그에 기록하기 위한 권한처리를 위해서 다음과 같이 레지스트리를 수정해야 합니다.

 

 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application 하위에 등록한 cliel이라는 키는 EventLogTraceListener클래스를 설정할때 initializeData에 설정한 값과 동일합니다.

 

이벤트 로그에 등록된 추적정보는 제어판 -> 관리자 도구 -> 이벤트 뷰어에서 볼 수 있습니다.

 

 

 

앞에서 살펴본 추적 출력은 경우에 따라 필요하거나 필요없는경우가 혼재될 수 있습니다. 이럴 때 마다 필요한 개체를 추가하거나 제거하기보다는 '진단 스위치'설정을 통해 추적 출력을 제어하는 것이 훨씬 편리할 것입니다.

 

<switches>
  <add name="switch" value="1"/>
</switches>

 

위 설정을 <system.diagnostics>하위에 추가한 후

 

BooleanSwitch bs = new BooleanSwitch("swich", "error switch");
System.Diagnostics.Trace.WriteIf(bs.Enabled, "error message");

 

BooleanSwitch클래스를 통해 Web.config에 추가한 스위치값을 확인하여 Enabled(1 / true)이면 Trace의 WriteIf메소드로 지정한 내용을 출력하도록 합니다.

 

BooleanSwitch클래스는 설정값이 0이 아니면 True로 간주하지만 TraceSwitch클래스는 0~5까지 값에 따라 Off, Error, Warning, Info, Verbose 단계를 판단합니다.

 

TraceSwitch ts = new TraceSwitch("switch", "level switch");
System.Diagnostics.Trace.WriteIf(ts.TraceInfo, "This is 3.");

 

TraceSwitch클래스의 단계만으로 부족하다면 SourceSwitch클래스를 사용하십시오. EventType개체를 통해 좀더 넓어진 단계를 설정할 수 있습니다.

 

SourceSwitch ss = new SourceSwitch("switch", "Error");
System.Diagnostics.Trace.WriteIf(ss.ShouldTrace(TraceEventType.Error), "This is Error");

 

참고로 switches의 add요소는 필요에 따라 Boolean, Trace, Source용을 따로 생성할 수 있으며 용도에 따라 각 값을 판단하는 클래스를 사용하시면 됩니다.

0 0