Share via


ASP.NET 상태 모니터링 이벤트 확장

업데이트: 2007년 11월

ASP.NET 상태 모니터링 기능을 확장하여 다음 작업을 수행할 수 있습니다.

  • 표준 웹 이벤트 형식에서 상속하여 사용자 지정 웹 이벤트 클래스를 만듭니다. 응용 프로그램이 WebBaseEvent 또는 WebBaseErrorEvent에서 상속하는 경우 부분 신뢰 환경에서 실행되어야 합니다. 기타 모든 이벤트의 경우 완전 신뢰 환경에서 실행되어야 합니다. 사용자 지정 이벤트에 사용자 지정 데이터를 추가하려면 FormatCustomEventDetails 메서드를 재정의합니다. ToString 메서드를 재정의하지 마십시오. 중요한 시스템 정보를 덮어쓰거나 훼손하는 일을 방지하기 위해서입니다. 사용자 지정 이벤트는 Raise 메서드를 호출하여 명시적으로 발생시켜야 합니다. 표준 이벤트의 경우 ASP.NET에서만 발생시킬 수 있습니다. 코드 예제를 보려면 방법: 사용자 지정 ASP.NET 상태 모니터링 이벤트 구현 및 발생을 참조하십시오.

  • IWebEventCustomEvaluator 인터페이스를 구현하는 클래스를 만들어 표준 이벤트 형식을 사용자 지정합니다.

  • WebEventProvider 또는 BufferedWebEventProvider 클래스를 상속하는 클래스를 만들어 이벤트를 처리할 사용자 지정 공급자를 만듭니다. 공급자가 기록을 수행하는 경우에는 WebEventFormatter 클래스를 사용할 수도 있습니다. 사용자 지정 이벤트 공급자를 사용하면 사용자 지정 로그 파일에 이벤트를 기록하고, 이벤트 데이터를 타사 응용 프로그램에 보내는 등의 작업을 수행할 수 있습니다. 코드 예제를 보려면 방법: 상태 모니터링 사용자 지정 공급자 예제 구현을 참조하십시오.

ASP.NET 상태 모니터링 이벤트 버퍼링

이벤트 버퍼링을 사용하도록 SQL 및 메일 상태 모니터링 이벤트 공급자(SqlWebEventProvider, SimpleMailWebEventProviderTemplatedMailWebEventProvider)를 구성할 수 있습니다. 이렇게 하면 전자 메일 메시지를 자주 보내거나 SQL 서버 삽입 작업을 자주 수행할 경우 응용 프로그램 성능에 미치는 영향을 줄일 수 있습니다. 또한 상태 모니터링 이벤트를 버퍼링하면 많은 양의 이벤트로 인한 과부하로부터 SMTP 서버와 SQL Server를 보호할 수 있습니다.

SQL 이벤트 공급자 버퍼링

SQL 이벤트 공급자에 대해 버퍼링을 사용하도록 설정하면 공급자는 이벤트 정보를 일괄적으로 데이터베이스에 삽입하기 전에 지정된 버퍼 모드에 따라 이벤트 정보를 버퍼링합니다.

기본적으로 SqlWebEventProvider 공급자는 버퍼링을 사용하도록 구성되어 있지 않으며 이벤트가 발생할 때마다 즉시 해당 정보가 데이터베이스에 삽입됩니다. SQL 공급자가 지정되어 있는 Web.config 파일의 providers 요소에서 add 요소의 buffer 특성을 true로 설정하는 방법으로 버퍼링을 사용하도록 설정하면 이 기본 설정을 재정의할 수 있습니다. 고유한 SQL 공급자를 구성하는 경우, 즉 SqlWebEventProvider를 사용하지 않는 경우 buffer 특성의 값을 지정하지 않으면 기본값 true로 설정됩니다.

미리 정의된 버퍼링 모드를 선택하여 버퍼링 동작을 사용자 지정할 수 있습니다. 또는 bufferModes 컬렉션에 사용자 지정 요소를 추가할 수도 있습니다. 각 요소는 버퍼 크기 및 버퍼 플러시 빈도 같은 속성을 정의합니다. 그런 다음 정의한 버퍼 모드 중 하나를 사용하도록 공급자를 구성할 수 있습니다.

다음 예제에서는 버퍼링이 설정된 SQL 이벤트 공급자의 구성 설정을 보여 줍니다.

참고:

AnalysisbufferModes 요소는 루트 Web.config 파일에 이미 구성되어 있으며 응용 프로그램 수준 Web.config 파일에서 다시 선언할 필요가 없습니다. SqlWebEventProviderproviders 요소도 루트 Web.config 파일에 구성되어 있지만 buffer 특성이 false로 설정되고 bufferMode 특성이 Notification으로 설정되어 있습니다. 따라서 예제에 나오는 providers 요소는 응용 프로그램 수준 Web.config 파일에서 선언해야 하며 clear 또는 remove 요소를 사용하여 SqlWebEventProvider 공급자에 대한 상위 수준 구성을 제거해야 합니다.

이 예제에서 SQL 이벤트 공급자는 버퍼링이 설정되어 있는 경우 bufferModes 요소에 정의된 Analysis 버퍼 모드를 사용하도록 구성되어 있습니다. 이 모드에서 공급자는 5분마다 이벤트 정보를 플러시합니다. 또한 각 알림에 대해 최대 100개의 이벤트를 플러시하고 이벤트 빈도가 갑자기 높아질 경우 최대 1000개의 이벤트를 버퍼링합니다. 공급자는 1분마다 최대 한 번만 이벤트를 보냅니다.

<healthMonitoring>
  <providers>
    <clear/>
    <add 
      ConnectionStringName="LocalSqlServer" 
      maxEventDetailsLength="1073741823"
      buffer="true" 
      bufferMode="Analysis" 
      name="SqlWebEventProvider"
      type="System.Web.Management.SqlWebEventProvider,System.Web, Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" 
    />
  </providers>
  <bufferModes>
    <add 
      name="Analysis" 
      maxBufferSize="1000" 
      maxFlushSize="100"
      urgentFlushThreshold="100" 
      regularFlushInterval="00:05:00"
      urgentFlushInterval="00:01:00" 
      maxBufferThreads="1"
    />
  </bufferModes>
</healthMonitoring>

전자 메일 이벤트 공급자 버퍼링

전자 메일 이벤트 공급자에 대해 버퍼링을 사용하도록 설정하면 공급자는 전자 메일 메시지를 이벤트 알림으로 보내기 전에 이벤트를 버퍼링합니다. 전자 메일 이벤트 공급자를 구성하고 전자 메일 이벤트 공급자에 대한 add 요소의 buffer 특성 값을 지정하지 않으면 기본값 true로 설정됩니다. buffer 특성을 false로 설정하여 버퍼링 기능을 해제할 수 있습니다.

미리 정의된 버퍼링 모드를 선택하여 버퍼링 동작을 사용자 지정할 수 있습니다. 또는 bufferModes 컬렉션에 사용자 지정 요소를 추가할 수도 있습니다. 각 요소는 버퍼 크기 및 버퍼 플러시 빈도 같은 속성을 정의합니다. 그런 다음 정의한 버퍼 모드 중 하나를 사용하도록 공급자를 구성할 수 있습니다. CriticalNotification 모드를 사용하는 것이 좋습니다.

다음 예제에서는 버퍼링 기능이 SimpleMailWebEventProvider 클래스에 대해 해제되어 있고 TemplatedMailWebEventProvider 클래스에 대해서는 설정된 전자 메일 이벤트 공급자의 구성 설정을 보여 줍니다. TemplatedMailWebEventProvider 공급자는 루트 Web.config 파일에 이미 구성되어 있는 CriticalNotification 버퍼 모드를 사용하도록 구성되어 있습니다. CriticalNotification 모드를 사용하는 경우 공급자는 이벤트를 받는 즉시 모든 이벤트 정보를 플러시하려고 하지만 전자 메일 서버에 과부하가 발생하지 않도록 하기 위해 플러시 간격이 1분 미만입니다. 메시지 크기는 관리 가능한 수준으로 최대 20개 이벤트의 정보를 포함합니다

상태 모니터링 시스템에 허용된 최대값보다 많은 이벤트 정보가 전달될 경우 새 이벤트가 생성되면 가장 오래된 이벤트가 삭제됩니다. 상태 모니터링 시스템에서는 버퍼가 꽉 찰 경우 플러시 간격을 줄여 이벤트를 삭제하지 않으려고 하지만 이벤트가 삭제된 경우에는 다음에 플러시할 때 이벤트가 삭제되었음을 알리는 메시지를 제외하고는 해당 이벤트의 정보를 보내지 않습니다. 공급자가 과부하 상태인 경우 최신 이벤트는 최대 5분 동안 지연됩니다. 이때 버퍼가 꽉 차서 최신 이벤트가 삭제되지 않는다고 가정합니다.

<healthMonitoring>
  <providers>
    <!-- mail provider with attributes that are always relevant -->
    <add 
      name="SimpleMailWebEventProvider" 
      type="System.Web.Management.SimpleMailWebEventProvider"
      to="SystemAdministrator@contoso.com"
      from="HealthMonitoring@contoso.com"
      buffer="false" 
    />
    <!-- mail provider with attributes that are relevant only 
         when buffering is enabled -->
    <add 
      name="SampleTemplatedMailWebEventProvider" 
      type="System.Web.Management.TemplatedMailWebEventProvider"
      to="SystemAdministrator@contoso.com" 
      from="HealthMonitoring@contoso.com" 
      buffer="true" 
      bufferMode="Critical Notification"
      template="Template.aspx" />
  </providers>
  <bufferModes>
    <add 
      name="Critical Notification" 
      maxBufferSize="100" maxFlushSize="20"
      urgentFlushThreshold="1" 
      regularFlushInterval="Infinite" 
      urgentFlushInterval="00:01:00"
      maxBufferThreads="1"
    />
  </bufferModes> 
</healthMonitoring>

예제를 실행하려면 다음 예제에서처럼 구성 파일에서 SMTP 서버를 구성해야 합니다.

<system.net>
  <mailSettings>
    <smtp deliveryMethod="Network">
      <network 
        defaultCredentials="true" 
        host="127.0.0.1" 
        port="25" 
        username="username" 
        password="password" />
    </smtp>
  </mailSettings>
</system.net>

자세한 내용은 <mailSettings> 요소(네트워크 설정)를 참조하십시오.

참고:

구성 파일에 일반 텍스트 암호를 저장하면 보안 문제가 발생할 수 있습니다. 자격 증명을 구성 파일에 유지할 경우에는 보호되는 구성을 사용하여 <mailSettings> 구성 요소의 내용을 암호화해야 합니다. 자세한 내용은 보호되는 구성을 사용하여 구성 정보 암호화를 참조하십시오.

버퍼 모드 설정

bufferModes 요소에서 add 요소의 다음 특성을 설정하여 버퍼 동작을 지정할 수 있습니다.

  • regularFlushInterval   정기적인 이벤트 정보 플러시 간격입니다.

  • urgentFlushThreshold   버퍼가 플러시되기 전에 해당 정보를 버퍼링할 이벤트의 수입니다.

다음 설정은 공급자가 이벤트 수신자에 대해 보장하는 내용을 지정합니다.

  • maxBufferSize   버퍼에 해당 정보를 포함할 최대 이벤트 수입니다. 이 값보다 많은 수의 이벤트가 버퍼에 포함되면 오래된 이벤트가 삭제됩니다.

  • maxFlushSize   공급자가 한 번에 플러시할 정보의 최대 이벤트 수입니다.

  • urgentFlushInterval   긴급한 다른 플러시를 수행하기 전에 공급자가 대기하는 최소 시간입니다. 마지막 플러시가 발생한 이후 urgentFlushInterval 속성에 설정된 시간이 경과하지 않은 상태에서 버퍼가 꽉 차면 오래된 이벤트의 정보가 버퍼에서 삭제됩니다. 공급자는 삭제된 이벤트의 수를 추적하고 다음 이벤트 알림을 보낼 때 경고 메시지를 포함합니다.

WMI를 사용하여 ASP.NET 상태 모니터링 이벤트 추적

ASP.NET 상태 이벤트를 모니터링하는 한 가지 방법은 WMI(Windows Management Instrumentation) 이벤트 공급자인 WmiWebEventProvider 클래스를 사용하는 것입니다. 이 공급자는 웹 상태 모니터링 이벤트(웹 이벤트)를 WMI 이벤트로 변환합니다. WMI에서는 모니터링할 엔터티를 개체로 나타낼 수 있는 표준 개체 모델을 제공합니다. 이러한 엔터티는 컴퓨터, 네트워크 카드, 프린터, 소프트웨어 응용 프로그램 등을 나타냅니다. 이 엔터티는 사용자 지정 응용 프로그램에서 모니터링할 수 있도록 WMI 개체 모델에 매핑됩니다. 다음 그림에서는 ASP.NET 웹 이벤트, WMI 및 WMI 이벤트를 수신하는 소비자 응용 프로그램 사이의 관계를 보여 줍니다.

ASP.NET과 WMI의 관계

상태 이벤트와 WMI 간의 연결

ASP.NET 상태 모니터링에서는 상태 이벤트와 WMI 사이를 연결하기 위한 인프라를 제공합니다. 이러한 연결은 이벤트가 WMI 개체로 처리될 수 있도록 이벤트를 WMI 클래스에 매핑하여 수행됩니다. 또한 ASP.NET 상태 모니터링에서는 상태 이벤트를 처리하고 WMI 시스템에 디스패치합니다. ASP.NET 이벤트를 WMI에 매핑하는 방법에 대한 자세한 내용은 연습: ASP.NET 상태 모니터링에서 WMI 이벤트 수신을 참조하십시오. WMI에 대한 자세한 내용은 MSDN 웹 사이트에서 Windows Management Instrumentation을 참조하십시오.

다음 목록에서는 WMI를 사용하여 상태 이벤트를 모니터링하는 단계를 설명합니다.

  1. 웹 이벤트 클래스와 WMI 개체 간의 매핑을 정의합니다. 이 단계는 각 표준 웹 이벤트 클래스에 대해 이미 수행되었습니다. 이러한 매핑은 ASP.NET의 MOF(Managed Object Format) 파일(%SystemRoot%\Microsoft.NET\Framework\<version>\aspnet.mof)에 포함되어 있습니다.

    참고:

    모든 사용자 지정 이벤트는 WMI의 기본 이벤트 형식에 매핑됩니다. 사용자 지정 ASP.NET 상태 모니터링 이벤트를 임의의 WMI 이벤트에 매핑할 수 없습니다.

    예를 들어 다음 코드에서는 WMI 클래스의 정의를 WebHeartbeatEvent 형식에 매핑합니다.

    class HeartbeatEvent : ManagementEvent {
        /*
         * ProcessStatistics    
         */
        DATETIME    ProcessStartTime;
        sint32      ThreadCount;
        sint64      WorkingSet;
        sint64      PeakWorkingSet;
        sint64      ManagedHeapSize;
        sint32      AppdomainCount;    
        sint32      RequestsExecuting;
        sint32      RequestsQueued;
        sint32      RequestsRejected;
    }; 
    

    MOF 파일에 대한 자세한 내용은 MSDN의 WMI SDK에서 Managed Object Format을 참조하십시오.

  2. 이벤트를 처리할 ASP.NET 상태 모니터링 공급자를 정의합니다.

    표준 공급자는 WmiWebEventProvider 클래스입니다. 기본적으로 이 공급자는 이미 다음 요소를 사용하여 루트 Web.config 파일의 healthMonitoring 섹션에 구성되어 있습니다.

    <providers>
      <add 
        name="WmiWebEventProvider" 
        type="System.Web.Management.WmiWebEventProvider,System.Web, Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" 
      />
    </providers>
    
  3. 구성 파일의 healthMonitoring 섹션에 적절한 설정을 입력하여 웹 이벤트 클래스와 WMI 이벤트 공급자(WmiWebEventProvider 클래스) 간의 연결을 만듭니다.

    기본적으로 WMI 이벤트 공급자는 웹 이벤트를 구독하지 않습니다. 응용 프로그램 수준 Web.config 파일에서 다음 요소를 사용하여 WMI 이벤트 공급자를 모든 웹 이벤트에 등록할 수 있습니다. 기본적으로 All Events 이벤트 형식은 루트 Web.config 파일의 eventMappings 요소에 구성되어 있으며 WebBaseEvent 클래스에 매핑되어 있습니다.

    <rules>
      <add 
        name="Testing Wmi"
        eventName="All Events" 
        provider="WmiWebEventProvider" 
        profile="Critical"
      />
    </rules>
    
  4. WMI 이벤트를 수힌하는 응용 프로그램을 만들거나 타사 응용 프로그램을 사용합니다.

    연습: ASP.NET 상태 모니터링에서 WMI 이벤트 수신의 코드 예제에서는 웹 이벤트가 발생할 때마다 이벤트 정보를 표시하는 콘솔 응용 프로그램을 만듭니다.

WMI 상태 이벤트 인프라 사용자 지정

웹 이벤트가 발생하면 ASP.NET 상태 모니터링에서는 WmiWebEventProvider 개체로 이 이벤트를 디스패치합니다. 또한 이 공급자 개체는 이벤트를 처리하고 관련 MOF 클래스 정의에 따라 적절한 데이터로 채운 다음 비관리 코드를 호출하여 WMI 시스템으로 이 데이터를 디스패치합니다.

웹 이벤트를 WMI로 보내기 위한 유일한 사용자 지정 옵션은 ASP.NET 상태 모니터링 이벤트가 WMI 이벤트로 발생한 후에 이 이벤트를 사용하는 사용자 지정 응용 프로그램을 만드는 것입니다. 이 경우 앞에서 설명한 대로 새 rules 요소를 구성하기만 하면 됩니다. 응용 프로그램에서는 운영 체제에 의해 발생한 ASP.NET 상태 이벤트를 WMI 이벤트 형식으로 수신합니다. 자세한 내용은 연습: ASP.NET 상태 모니터링에서 WMI 이벤트 수신을 참조하십시오.

참고:

WmiWebEventProvider 클래스를 확장할 수 없습니다. 확장할 수 있는 이벤트 공급자 클래스는 WebEventProviderBufferedWebEventProvider뿐입니다.

사용자 지정 ASP.NET 상태 모니터링 이벤트 및 공급자 구현

기본적으로 일부 이벤트는 성능 카운터 또는 이벤트 로그에서 이미 캡처되었거나 ASP.NET 추적 시스템에 전달되었습니다. 다른 이벤트를 기존 공급자에 매핑하여 사용할 수 있습니다. 자세한 내용은 ASP.NET 상태 모니터링 개요의 "이벤트 공급자를 통해 웹 이벤트 사용" 단원을 참조하십시오.

기존 웹 이벤트나 공급자 클래스가 조건에 맞지 않을 경우에는 해당 클래스를 확장할 수 있습니다. 다음 표에서는 ASP.NET 상태 모니터링을 사용자 지정하는 방법을 보여 줍니다.

작업

구현

예제

사용자 지정 웹 이벤트 클래스 만들기

WebBaseEvent에서 상속되고 Raise 가상 메서드를 구현하는 클래스를 만듭니다. 사용자 지정 이벤트에 사용자 지정 데이터를 추가하려면 FormatCustomEventDetails 메서드를 재정의합니다.

방법: 사용자 지정 ASP.NET 상태 모니터링 이벤트 구현 및 발생

기본 제공된 웹 이벤트 또는 사용자 지정 웹 이벤트를 처리하기 위해 사용자 지정 이벤트 공급자 만들기

WebEventProvider 클래스 또는 파생 클래스 중 하나에서 상속되는 클래스를 만듭니다. 공급자에서 로깅을 수행할 경우에는 WebEventFormatter 클래스에서도 상속합니다.

방법: 상태 모니터링 사용자 지정 공급자 예제 구현

참고 항목

작업

방법: ASP.NET 구성 설정 잠금

개념

ASP.NET 상태 모니터링 개요

ASP.NET 구성 개요

참조

healthMonitoring에 대한 bufferModes 요소(ASP.NET 설정 스키마)

healthMonitoring에 대한 providers 요소(ASP.NET 설정 스키마)