IIS 7.0 관리형 모듈에 추적을 추가하는 방법

작성자: Saad Ladki

소개

IIS 7.0 이상에서는 사용자 지정 개발 관리 모듈을 연결하고 사용하여 다양한 작업을 수행하고 모든 종류의 콘텐츠에 해당 모듈을 사용하는 기능을 제공합니다. 그러나 문제가 발생합니다. 모듈에 문제가 있거나 문제가 있으면 어떻게 되나요? 이전에는 System.Diagnostics를 사용하여 문제가 발생했을 때 이벤트를 추적했습니다. 아쉽게도 이러한 추적은 IIS 추적과 완전히 별개입니다.

IIS 7.0 이상에는 그렇지 않습니다. 이제 System.Diagnostics.TraceSource(.Net 2.0의 새로운 기능)를 사용하여 모듈 코드에 추적을 추가할 수 있습니다. 추적을 사용하는 모듈(예: 실패한 요청 추적)에서 사용할 수 있도록 이러한 추적을 IIS 추적 인프라로 라우팅할 수 있습니다.

IIS 팀은 다음과 같은 기본 패턴을 사용하여 코드를 계측하도록 권장합니다.

  • 시작 & 코드 내의 주요 활동에 대한 이벤트 중지
  • 경고 & 요청이 실패할 수 있는 예기치 않은 발생에 대한 오류 이벤트(예: 인증 실패)
  • 사용 중인 모듈 구성과 같은 진단 대한 도움말을 위한 INFORMATIONAL & VERBOSE 이벤트

이 연습에서 설명하는 작업은 다음과 같습니다.

  • System.Diagnostics.TraceSource를 사용하여 모듈에 추적 추가
  • 이러한 추적을 캡처하도록 실패한 요청 추적 구성
  • 실패 조건 생성 및 결과 추적 보기

사전 요구 사항

이 문서의 작업을 수행하기 전에 아래 단계를 수행합니다.

1단계: IIS 설치

먼저 IIS를 설치해야 합니다. 로 이동하여 IIS가 설치되어 있는지 확인합니다 http://localhost/. IIS가 설치된 경우 "생성 중" 페이지가 표시됩니다. IIS가 설치되지 않은 경우 지침은 IIS 설치를 참조하세요. 다음 IIS 구성 요소를 설치해야 합니다.

  • ASP(World Wide Web Services => 애플리케이션 개발 기능 => ASP 아래)
  • ASP.Net(World Wide Web Services => 애플리케이션 개발 기능 => ASP.Net)
  • 추적(World Wide Web Services => Health & Diagnostics => Tracing 아래)

2단계: 관리자 권한으로 로그인

관리자 계정 또는 Administrators 그룹에 있는 그대로 로그인합니다.

참고

Administrators 그룹에 있는 것은 기본적으로 완전한 관리자 권한을 부여하지 않습니다. 관리자 권한으로 많은 애플리케이션을 실행해야 합니다. 애플리케이션 아이콘을 마우스 오른쪽 단추로 클릭하고 "관리자 권한으로 실행"을 선택합니다.

3단계: 백업 만들기

이 문서의 작업을 실행하기 전에 구성을 백업합니다. 다음을 실행합니다.

  1. 시작 단추 -> 모든 프로그램 - 액세서리 ->> (r 클릭)명령 프롬프트 -> 관리자 권한으로 실행을 클릭합니다.
    마우스 오른쪽 단추 클릭 드롭다운 메뉴의 관리자 권한으로 실행 옵션에 포커스가 있는 Windows 시작 메뉴의 스크린샷

  2. 해당 명령 프롬프트에서 다음 명령을 실행합니다.

    %windir%\system32\inetsrv\appcmd add backup
    

4단계: 샘플 콘텐츠 만들기

  1. 폴더의 모든 항목을 삭제합니다 c:\inetpub\wwwroot .
  2. 위에서 시작한 관리자 명령 프롬프트에서 연결된 코드를 test.htm이라는 inetpub\wwwroot의 파일에 붙여넣습니다.
<h2>HOWTO: Adding tracing to modules </h2>
This is a sample page served by the static file handler (native code).

간단한 모듈 추적 & 만들기

이 섹션에서는 계측할 샘플 모듈을 만듭니다.

1단계: 간단한 모듈 만들기

관리자 명령 프롬프트를 사용하여 다음 코드를 복사하여 IIS_MOD_REQDATA.cs라는 파일에 붙여넣습니다.

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;

namespace IIS_MOD_REQDATA
{
    public class IIS_MOD_REQDATA : IHttpModule
    {
        public void Init(HttpApplication application)
        {
            application.EndRequest += (new EventHandler(this.Application_EndRequest));
        }

        private void Application_EndRequest(Object source, EventArgs e)
        {
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;

            // start writing out the request data

            context.Response.Write("<hr>");
            context.Response.Write("<b><font size=2 color=green>REQUEST HEADERS</font></b><br>");
            context.Response.Write("<font size=2>");
            context.Response.Write("METHOD : " + context.Request.HttpMethod + "<br>");
            context.Response.Write("URL : " + context.Request.Url + "<br>");
            context.Response.Write("QUERYSTRING : " + context.Request.QueryString + "<br>");
            context.Response.Write("</font><br>");

            // now response data

            context.Response.Write("<b><font size=2 color=blue>RESPONSE HEADERS</font></b><br>");
            context.Response.Write("<font size=2>");
            context.Response.Write("STATUS CODE : " + context.Response.StatusCode.ToString() + "." + context.Response.SubStatusCode.ToString() + "<br>");
            context.Response.Write("CONTENT TYPE : " + context.Response.ContentType.ToString() + "<br>");
            context.Response.Write("EXPIRES : " + context.Response.Expires.ToString() + "<br>");
            context.Response.Write("</font><br>");

            // set cache policy on response so it's not cached.

            context.Response.DisableKernelCache();
        }

        public void Dispose()
        {
        }
    }
}

2단계: 관리되는 모듈에 추적 추가

모듈에 추적을 추가하고 추적 이벤트를 IIS로 라우팅하려면 System.Diagnostics.Trace 원본을 사용합니다. using 문 아래에 다음 줄을 추가합니다.

using System.Diagnostics;

코드 내에서 TraceSource를 만들어야 합니다. IIS_MOD_REQDATA 모듈 선언 내에서 traceSource의 정의를 확인합니다.

public class IIS_MOD_REQDATA : IHttpModule
{
    TraceSource tsStatus;

tsStatus 멤버는 IHttpModule의 Init() 메서드 중에 초기화됩니다.

public void Init(HttpApplication application)    
{    
    application.EndRequest += (new EventHandler(this.Application_EndRequest));
    // setup traceSource
    tsStatus = new TraceSource("tsStatus");    
}

이 이름은 나중에 web.config 파일에서 참조되므로 TraceSource("tsStatus")의 이름이 중요합니다. 이제 필요한 경우 이벤트를 내보내도록 모듈이 설정되었습니다.

새 추적 이벤트를 추가하려면 tsStatus.TraceEvent(<type>, 0, <somestring)를> 사용하여 이벤트를 작성합니다. 권장 Start & End 이벤트를 Application_EndRequest() 메서드에 추가합니다.

private void Application_EndRequest(Object source, EventArgs e)        
{    
    tsStatus.TraceEvent(TraceEventType.Start, 0, "[REQDATA MODULE] START EndRequest");

    // other code

    tsStatus.TraceEvent(TraceEventType.Stop, 0, "[REQDATA MODULE] END EndRequest");    
}

다른 <형식>의 유형에 주목하세요. 지원되는 형식은 다음과 같습니다.

  • TraceEventType.Start
  • TraceEventType.Stop
  • TraceEventType.Error
  • TraceEventType.Warning
  • TraceEventType.Information
  • TraceEventType.Verbose

완전성을 위해 모듈의 전체 원본(추적 이벤트 포함)은 여기에서 복사할 수 있습니다.

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Diagnostics;

namespace IIS_MOD_REQDATA
{
    public class IIS_MOD_REQDATA : IHttpModule
    {

        TraceSource tsStatus;

        public void Init(HttpApplication application)
        {
            application.EndRequest += (new EventHandler(this.Application_EndRequest));

            // TRACING

            tsStatus = new TraceSource("tsStatus");
        }

        private void Application_EndRequest(Object source, EventArgs e)
        {
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;

            tsStatus.TraceEvent(TraceEventType.Start, 0, "[REQDATA MODULE] START EndRequest");

            // start writing out the request data

            context.Response.Write("<hr>");
            context.Response.Write("<b><font size=2 color=green>REQUEST HEADERS</font></b><br>");
            context.Response.Write("<font size=2>");
            context.Response.Write("METHOD : " + context.Request.HttpMethod + "<br>");
            context.Response.Write("URL : " + context.Request.Url + "<br>");
            context.Response.Write("QUERYSTRING : " + context.Request.QueryString + "<br>");
            context.Response.Write("</font><br>");

            tsStatus.TraceEvent(TraceEventType.Verbose, 0, "[REQDATA MODULE] done with Req Data, moving onto Response");

            // now response data

            context.Response.Write("<b><font size=2 color=blue>RESPONSE HEADERS</font></b><br>");
            context.Response.Write("<font size=2>");
            context.Response.Write("STATUS CODE : " + context.Response.StatusCode.ToString() + "." + context.Response.SubStatusCode.ToString() + "<br>");
            context.Response.Write("CONTENT TYPE : " + context.Response.ContentType.ToString() + "<br>");
            context.Response.Write("EXPIRES : " + context.Response.Expires.ToString() + "<br>");
            context.Response.Write("</font><br>");

            if (context.Response.StatusCode > 399)
            {
                tsStatus.TraceEvent(TraceEventType.Warning, 0, "[REQDATA MODULE] error status code detected");
            }

            tsStatus.TraceEvent(TraceEventType.Verbose, 0, "[REQDATA MODULE] done with Response Data");

            // set cache policy on response so it's not cached.

            context.Response.DisableKernelCache();
            tsStatus.TraceEvent(TraceEventType.Verbose, 0, "[REQDATA MODULE] cache setting is (" + context.Response.Cache.ToString() + ")");

            tsStatus.TraceEvent(TraceEventType.Stop, 0, "[REQDATA MODULE] STOP - EndRequest");
        }

        public void Dispose()
        {
        }
    }
}

3단계: 추적된 모듈 컴파일

이제 모듈을 컴파일하려면 모듈을 배포할 & 있습니다. 관리자 명령 프롬프트에서 다음 명령을 실행합니다.

%systemroot%\Microsoft.NET\Framework\v2.0.50727\csc.exe /target:library /out:IIS_MOD_REQDATA.dll /debug /d:TRACE /R:System.Web.dll IIS_MOD_REQDATA.cs

메모장의 느낌표 코드 대시 콘솔메인 명령의 스크린샷.

참고

64비트 시스템에서 이를 실행하는 경우 의 64비트 c# 컴파일러를 사용하여 컴파일합니다. %windir%\microsoft.net\framework64\v2.0.50727\csc.exe

/debug & /d:TRACE 스위치를 사용합니다. 이러한 스위치를 사용하여 추적 이벤트를 이진 파일로 컴파일 해야 합니다 . 이러한 스위치를 사용하여 컴파일하지 못하면 모듈에 추적 이벤트가 없습니다.

모듈을 컴파일한 후 모듈을 배포하고 초기 테스트를 실행하여 추적을 캡처하기 전에 모듈이 작동하는지 확인합니다.

사이트 구성에 모듈 추가

이 섹션에는 모듈 추가 및 테스트가 포함되어 있습니다.

1단계: 사이트 구성에 모듈 추가

  1. 동일한 관리자 명령 프롬프트를 사용하여 \inetpub\wwwroot\bin이라는 디렉터리를 만들고 IIS_MOD_REQDATA.dll 해당 디렉터리에 복사합니다.
  2. 모듈을 사용하도록 설정합니다. 관리자 명령 프롬프트 에서 start inetmgr 을 입력하여 IIS 관리 UI를 표시합니다.
  3. 연결 창에서 로컬 컴퓨터 이름, 사이트를 차례로 확장하고 기본 웹 사이트를 클릭합니다.
  4. 가운데 창의 IIS 아래에서 모듈을 두 번 클릭합니다.
    모듈 옵션이 강조 표시된 기본 웹 사이트 홈 화면의 스크린샷
  5. 이 사이트에서 사용하도록 구성된 많은 모듈 목록이 표시됩니다. 작업 아래의 UI 오른쪽에서 관리되는 모듈 추가를 클릭합니다.
    관리되는 모듈 추가 옵션에 포커스가 있는 작업 창의 스크린샷
  6. 표시되는 창에서 관리되는 모듈 의 이름을 IIS_MOD_REQDATA 모듈의 형식이 IIS_MOD_REQDATA. IIS_MOD_REQDATA(드롭다운 목록 상자에서 선택):
    이름 및 형식 필드를 보여 주는 관리형 모듈 추가 대화 상자의 스크린샷
  7. 확인을 클릭합니다. 이제 웹 사이트의 사용을 위해 새로 추적된 모듈이 구성되었습니다.
    새로 추적된 모듈을 보여 주는 모듈 화면의 스크린샷

2단계: 모듈 테스트

인터넷 Explorer 열고 로 이동하여 모듈을 테스트합니다http://localhost/test.htm. 다음 창이 표시됩니다.

여기에서 읽는 웹 페이지의 스크린샷은 정적 파일 처리기에서 제공하는 샘플 페이지입니다.

"REQUEST HEADERS" & "RESPONSE HEADERS" 콘텐츠는 모듈에서 제공되어 작동함을 나타냅니다.

IIS로 이벤트 라우팅

이 작업은 모듈의 TraceSource를 IIS 추적에 연결하여 해당 이벤트가 IIS를 통해 내보내도록 한 다음, 이러한 추적 이벤트를 캡처하도록 실패 요청 추적을 구성합니다.

1단계: 모듈 TraceSource & 이벤트를 IIS로 라우팅

추적 이벤트를 포함하도록 모듈이 업데이트됩니다. 이러한 추적 이벤트를 캡처하고 IIS의 실패한 요청 추적 모듈로 라우팅하도록 System.Diagnostics 및 IIS를 구성합니다. 이렇게 하려면 web.config 파일에서 system.진단> 섹션을 구성<하여 해당 이벤트를 적절하게 라우팅할 & TraceSource를 설정합니다.

  1. 관리자 명령 프롬프트를 사용하여 로 c:\inetpub\wwwroot이동하고 메모장을 사용하여 web.config 파일을 편집합니다.

  2. 모듈에서 내보낸 이벤트를 IIS의 추적 인프라로 라우팅하려면 구성의 3부분이 완료되어야 합니다.

    • IIS 이벤트 traceListener를 공유 수신기로 정의
    • 모든 이벤트를 사용하도록 스위치 정의
    • 추적 원본을 정의하고, 정의한 스위치를 연결하고, 원본에 대한 추적 수신기를 정의합니다.
  3. IIS는 TraceSource 이벤트를 IIS의 추적 인프라로 라우팅하는 데 사용되는 새 System.Diagnostics.TraceListener를 제공합니다. 이 공급자는 web.config 파일에서도 정의해야 합니다.

  4. 이름(tsStatus)으로 traceSource를 정의하고 이를 DefaultSwitch & IisTraceListener에 연결합니다.

  5. 이 <시스템을 복사하여 붙여넣습니다. > web.config 파일(섹션 뒤 <system.webServer> )에 대한 진단 섹션입니다.

    <system.diagnostics>
        <sharedListeners>
          <add name="IisTraceListener" type="System.Web.IisTraceListener, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        </sharedListeners>
    
        <switches>
          <add name="DefaultSwitch" value="All" />
        </switches>
    
        <sources>
          <source name="tsStatus" switchName="DefaultSwitch">
            <listeners>
              <add name="IisTraceListener" type="System.Web.IisTraceListener, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
            </listeners>
          </source>
        </sources>
    </system.diagnostics>
    

tsStatus traceSource는 IIS7TraceListener에 연결되며, IIS의 추적 인프라로 이벤트를 내보냅니다. 다음 단계로 계속 진행하여 이러한 이벤트를 실패한 요청 추적 공급자에 연결합니다.

2단계: 실패한 요청 추적을 사용하여 모듈 추적 이벤트 캡처

이러한 진단 이벤트가 IIS의 추적 인프라로 내보내지면 해당 공급자의 모듈 플래그를 & ASP.net 공급자에 매핑됩니다. 자세한 내용은 사용된 TraceEventType에 따라 달라집니다. 이러한 항목을 선택하도록 실패한 요청 추적을 구성하려면 다음을 수행합니다.

  1. 관리자 명령 프롬프트 에서 start inetmgr을 입력합니다. 연결 패널에서 컴퓨터 이름을 확장한 다음 사이트 폴더를 확장한 다음 기본 웹 사이트를 클릭합니다. 작업 창 오른쪽의 구성 아래에서 실패한 요청 추적... 링크를 클릭합니다.
    실패한 요청 추적 옵션이 강조 표시된 작업 창의 웹 사이트 관리 섹션 스크린샷

  2. 다음 대화 상자에서 다음을 구성합니다.
    웹 사이트 실패한 요청 추적 설정 편집 대화 상자의 스크린샷

  3. 검사 사용 확인란을 선택합니다. 다른 설정에 대한 기본값을 유지합니다. 계속하려면 확인 을 클릭합니다.

  4. 실패한 요청 추적 로깅이 사용하도록 설정되어 있는지 확인했으므로 이제 실패 정의를 구성해야 합니다. IIS 관리자로 돌아가서 IIS에서 실패한 요청 추적 규칙을 두 번 클릭합니다.
    실패한 요청 추적 규칙 옵션이 강조 표시된 기본 웹 사이트 홈 화면의 스크린샷

  5. 작업 창에서 추가...를 클릭합니다. 그러면 실패한 요청 추적 규칙 추가 마법사가 시작됩니다.

  6. 추적할 콘텐츠 지정 페이지에서 추적할 내용에 대한 모든 콘텐츠(*) 옵션을 선택합니다. 다음을 클릭합니다.
    다음 옵션에 포커스가 있는 실패한 요청 추적 규칙 추가 페이지의 스크린샷

  7. 추적 조건 정의 화면에서 상태 코드 검사 상자를 검사 추적할 상태 코드로 "200"을 입력할 & 있습니다.
    상태 코드 필드가 선택된 추적 조건 정의 화면의 스크린샷

  8. 다음을 클릭합니다. 추적 공급자 선택 페이지가 나타납니다. ASPNET 검사 상자와 "영역" 아래의 모듈 & 페이지 검사 상자를 선택합니다. 자세한 정보 표시에서 자세한 정보를 선택합니다.
    ASPNET 공급자 옵션이 강조 표시된 추적 공급자 선택 화면의 스크린샷

    참고

    서버 베타 3 빌드의 버그로 인해 모듈 및 페이지 영역이 모두 선택된 경우에만 모듈 추적을 캡처할 수 있습니다. Post Server Beta 3, 이러한 이벤트를 수집하려면 모듈만 필요합니다.

  9. Finish를 클릭합니다. 기본 웹 사이트에 대한 다음 정의가 표시됩니다.
    실패한 요청 추적 규칙 화면의 스크린샷.

결과 테스트 및 보기

이 작업에서는 실패한 요청을 생성하고 결과 추적 로그를 확인합니다. 200으로 실패한 * 요청에 대한 추적 로그를 http://localhost/캡처하도록 IIS를 구성했습니다. 작동했는지 확인하려면 다음을 수행합니다.

  1. 새 인터넷 Explorer 창을 엽니다. 주소를 입력합니다 http://localhost/test.htm. 다시 다음과 같은 내용이 표시됩니다.
    인터넷 Explorer 창의 샘플 웹 페이지 스크린샷
  2. 모듈에서 캡처된 추적을 생성했는지 확인하려면 관리자 권한 인터넷 Explorer 창을 사용하고 Ctrl-O를 누른 다음 로 c:\inetpub\logs\FailedReqLogFiles\W3SVC1이동합니다. HTML 파일을 읽는 드롭다운 목록 상자에서 모든 파일을 선택합니다.
  3. 가장 최근 fr#######.xml 파일(오늘 날짜)을 선택하고 열기를 클릭합니다. 다음과 같은 이벤트가 표시됩니다.
    사용자 지정 모듈 추적 탭을 보여 주는 진단 요청 화면의 스크린샷

요약

관리되는 모듈에 새 추적 이벤트 추가를 완료하고, 해당 모듈을 컴파일 및 배포하고, 이벤트를 IIS의 추적 인프라로 라우팅하도록 System.Diagnostics를 구성하고, 마지막으로 이벤트를 캡처하도록 IIS의 실패한 요청 추적 기능을 구성했습니다. 이제 모듈에 새 이벤트를 쉽게 추가한 다음 모듈을 다시 컴파일하여 \bin 디렉터리에 배포할 & 있습니다. 실패한 요청 추적을 사용하면 이벤트의 결과가 표시됩니다.

System.Diagnostics.TraceSource를 사용하면 다른 추적 수신기에 연결하는 경우 모듈 및 해당 추적 이벤트를 수준 아래로 계속 사용할 수 있습니다.