다음을 통해 공유


ASP.NET 상태 모니터링을 사용하여 오류 세부 정보 로깅(C#)

스콧 미첼

Microsoft의 상태 모니터링 시스템은 처리되지 않은 예외를 포함하여 다양한 웹 이벤트를 기록하는 쉽고 사용자 지정 가능한 방법을 제공합니다. 이 자습서에서는 처리되지 않은 예외를 데이터베이스에 기록하고 전자 메일 메시지를 통해 개발자에게 알리도록 상태 모니터링 시스템을 설정하는 방법을 안내합니다.

소개

로깅은 배포된 애플리케이션의 상태를 모니터링하고 발생할 수 있는 문제를 진단하는 데 유용한 도구입니다. 특히 배포된 애플리케이션에서 발생하는 오류를 기록하여 해결할 수 있도록 하는 것이 중요합니다. 이 Error 이벤트는 ASP.NET 애플리케이션에서 처리되지 않은 예외가 발생할 때마다 발생합니다. 이전 자습서 에서는 개발자에게 오류를 알리고 이벤트에 대한 Error 이벤트 처리기를 만들어 세부 정보를 기록하는 방법을 보여 줍니다. 그러나 ASP에서 Error 이 작업을 수행할 수 있으므로 오류의 세부 정보를 기록하고 개발자에게 알리는 이벤트 처리기를 만들 필요가 없습니다. NET의 상태 모니터링 시스템입니다.

상태 모니터링 시스템은 ASP.NET 2.0에서 도입되었으며 애플리케이션 또는 요청의 수명 동안 발생하는 이벤트를 로깅하여 배포된 ASP.NET 애플리케이션의 상태를 모니터링하도록 설계되었습니다. 상태 모니터링 시스템에서 기록된 이벤트를 상태 모니터링 이벤트 또는 웹 이벤트라고 하며 다음을 포함합니다.

  • 애플리케이션 수명 이벤트(예: 애플리케이션 시작 또는 중지 시기)
  • 실패한 로그인 시도 및 실패한 URL 권한 부여 요청을 포함한 보안 이벤트
  • 처리되지 않은 예외를 비롯한 애플리케이션 오류, 상태 구문 분석 예외 보기, 요청 유효성 검사 예외 및 컴파일 오류 등이 있습니다.

상태 모니터링 이벤트가 발생하면 지정된 로그 원본 수에 기록할 수 있습니다. 상태 모니터링 시스템은 웹 이벤트를 Microsoft SQL Server 데이터베이스, Windows 이벤트 로그 또는 전자 메일 메시지를 통해 기록하는 로그 원본과 함께 제공됩니다. 사용자 고유의 로그 원본을 만들 수도 있습니다.

상태 모니터링 시스템 로그와 사용된 로그 원본이 정의되는 Web.config이벤트는 . 몇 줄의 구성 태그를 사용하면 상태 모니터링을 사용하여 처리되지 않은 모든 예외를 데이터베이스에 기록하고 이메일을 통해 예외를 알릴 수 있습니다.

상태 모니터 시스템 구성 살펴보기

상태 모니터링 시스템의 동작은 구성 정보에 의해 정의되며, 이 정보는 에 있는 요소<healthMonitoring> 있습니다Web.config. 이 구성 섹션에서는 다음과 같은 세 가지 중요한 정보를 정의합니다.

  1. 발생할 때 기록해야 하는 상태 모니터링 이벤트
  2. 로그 원본 및
  3. (1)에 정의된 각 상태 모니터링 이벤트가 (2)에 정의된 로그 원본에 매핑되는 방식입니다.

이 정보는 각각 세 개의 <eventMappings>자식 구성 요소인 , <providers><rules>를 통해 지정됩니다.

기본 상태 모니터링 시스템 구성 정보는 폴더의 Web.config 파일에서 %WINDIR%\Microsoft.NET\Framework\version\CONFIG 찾을 수 있습니다. 간결성을 위해 일부 태그가 제거된 이 기본 구성 정보는 다음과 같습니다.

<configuration>
  <system.web>
  <healthMonitoring>
  <eventMappings>
  <add name="All Errors" type="System.Web.Management.WebBaseErrorEvent,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>

  <add name="Failure Audits" type="System.Web.Management.WebFailureAuditEvent,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>
  </eventMappings>

  <providers>
  <add name="EventLogProvider" type="System.Web.Management.EventLogWebEventProvider,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"/>

  <add connectionStringName="LocalSqlServer" maxEventDetailsLength="1073741823" buffer="false" bufferMode="Notification" name="SqlWebEventProvider" type="System.Web.Management.SqlWebEventProvider,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"/>
  </providers>

  <rules>
  <add name="All Errors Default" eventName="All Errors" provider="EventLogProvider" profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:01:00" custom=""/>

  <add name="Failure Audits Default" eventName="Failure Audits" provider="EventLogProvider" profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:01:00" custom=""/>
  </rules>
  </healthMonitoring>
  </system.web>
</configuration>

관심 있는 상태 모니터링 이벤트는 요소에 <eventMappings> 정의되어 있으며, 이 요소는 상태 모니터링 이벤트 클래스에 인간 친화적인 이름을 지정합니다. 위의 <eventMappings> 태그에서 요소는 형식 WebBaseErrorEvent 의 상태 모니터링 이벤트에 인간 친화적인 이름 "All Errors"를 할당하고 형식의 상태 모니터링 이벤트에 WebFailureAuditEvent는 "Failure Audits"라는 이름을 할당합니다.

요소는 <providers> 로그 원본을 정의하여 사용자에게 친숙한 이름을 제공하고 로그 원본 관련 구성 정보를 지정합니다. 첫 번째 <add> 요소는 클래스를 사용하여 지정된 상태 모니터링 이벤트를 기록하는 "EventLogProvider" 공급자를 EventLogWebEventProvider 정의합니다. 클래스는 EventLogWebEventProvider Windows 이벤트 로그에 이벤트를 기록합니다. 두 번째 <add> 요소는 클래스를 통해 Microsoft SQL Server 데이터베이스에 이벤트를 기록하는 "SqlWebEventProvider" 공급자를 SqlWebEventProvider 정의합니다. "SqlWebEventProvider" 구성은 다른 구성 옵션 중에서 데이터베이스의 연결 문자열(connectionStringName)를 지정합니다.

요소는 <rules> 요소에 지정된 이벤트를 요소의 <eventMappings> 로그 원본에 <providers> 매핑합니다. 기본적으로 ASP.NET 웹 애플리케이션은 처리되지 않은 모든 예외와 감사 실패를 Windows 이벤트 로그에 기록합니다.

데이터베이스에 이벤트 로깅

상태 모니터링 시스템의 기본 구성은 애플리케이션의 파일에 섹션 Web.config 을 추가하여 <healthMonitoring> 웹 애플리케이션별로 사용자 지정할 수 있습니다. 요소를 <eventMappings>사용하여 , <providers><rules> 섹션에 추가 요소를 포함할 <add> 수 있습니다. 기본 구성에서 설정을 제거하려면 요소를 사용 <remove> 하거나 이러한 섹션 중 하나에서 모든 기본값을 제거하는 데 사용합니다 <clear /> . 클래스를 사용하여 처리되지 않은 모든 예외를 Microsoft SQL Server 데이터베이스에 기록하도록 Book Reviews 웹 애플리케이션을 SqlWebEventProvider 구성해 보겠습니다.

클래스 SqlWebEventProvider 는 상태 모니터링 시스템의 일부이며 상태 모니터링 이벤트를 지정된 SQL Server 데이터베이스에 기록합니다. 클래스는 SqlWebEventProvider 지정된 데이터베이스에 이름이 지정된 aspnet_WebEvent_LogEvent저장 프로시저를 포함해야 합니다. 이 저장 프로시저는 이벤트의 세부 정보를 전달하고 이벤트 세부 정보를 저장하는 작업을 수행합니다. 좋은 소식은 이 저장 프로시저나 이벤트 세부 정보를 저장할 테이블을 만들 필요가 없다는 것입니다. 도구를 사용하여 데이터베이스에 이러한 개체를 aspnet_regsql.exe 추가할 수 있습니다.

참고 항목

이 도구는 aspnet_regsql.exe ASP에 대한 지원을 추가했을 때 Application Services를 사용하는 웹 사이트 구성 자습서에서 다시 설명했습니다. NET의 애플리케이션 서비스입니다. 따라서 Book Reviews 웹 사이트의 데이터베이스에는 이벤트 정보를 테이블aspnet_WebEvent_Events로 저장하는 저장 프로시저가 이미 포함되어 aspnet_WebEvent_LogEvent 있습니다.

필요한 저장 프로시저와 테이블이 데이터베이스에 추가되면 상태 모니터링에 처리되지 않은 모든 예외를 데이터베이스에 기록하도록 지시하기만 하면 됩니다. 웹 사이트의 Web.config 파일에 다음 태그를 추가하여 이 작업을 수행합니다.

<configuration>
  ...
  <system.web>
  ...
  <healthMonitoring enabled="true">
  <eventMappings>
  <clear />

  <add name="All Errors" type="System.Web.Management.WebBaseErrorEvent"
  startEventCode="0" endEventCode="2147483647" />
  </eventMappings>

  <providers>
  <clear />

  <add connectionStringName="ReviewsConnectionString" maxEventDetailsLength="1073741823"
  buffer="false" name="SqlWebEventProvider"
  type="System.Web.Management.SqlWebEventProvider" />
  </providers>

  <rules>
  <clear />

  <add name="All Errors Default" eventName="All Errors" provider="SqlWebEventProvider"
  profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00" />
  </rules>
  </healthMonitoring>
  </system.web>
</configuration>

위의 상태 모니터링 구성 태그는 요소를 사용하여 <clear /> , <providers><rules> 섹션에서 미리 정의된 상태 모니터링 구성 정보를 <eventMappings>초기화합니다. 그런 다음 이러한 각 섹션에 단일 항목을 추가합니다.

  • <eventMappings> 요소는 처리되지 않은 예외가 발생할 때마다 발생하는 "All Errors"라는 관심 있는 단일 상태 모니터링 이벤트를 정의합니다.
  • 요소는 <providers> 클래스를 사용하는 "SqlWebEventProvider"라는 단일 로그 원본을 SqlWebEventProvider 정의합니다. 이 특성은 connectionStringName 섹션에 정의된 <connectionStrings> 연결 문자열 이름인 "ReviewsConnectionString"으로 설정되었습니다.
  • 마지막으로 규칙 <> 요소는 "All Errors" 이벤트가 발생할 때 "SqlWebEventProvider" 공급자를 사용하여 로깅해야 임을 나타냅니다.

이 구성 정보는 상태 모니터링 시스템에 처리되지 않은 모든 예외를 Book Reviews 데이터베이스에 기록하도록 지시합니다.

참고 항목

WebBaseErrorEvent 이벤트는 서버 오류에 대해서만 발생하며, 찾을 수 없는 ASP.NET 리소스에 대한 요청과 같은 HTTP 오류에 대해서는 발생하지 않습니다. 이는 서버 및 HTTP 오류 모두에 HttpApplication 대해 발생하는 클래스 Error 이벤트의 동작과 다릅니다.

작동 중인 상태 모니터링 시스템을 보려면 웹 사이트를 방문하여 방문하여 런타임 오류를 생성합니다 Genre.aspx?ID=foo. 예외 세부 정보 사망의 노란색 화면(로컬로 방문할 때) 또는 사용자 지정 오류 페이지(프로덕션에서 사이트를 방문할 때)와 같은 적절한 오류 페이지가 표시됩니다. 백그라운드에서 상태 모니터링 시스템은 오류 정보를 데이터베이스에 기록했습니다. 테이블에 하나의 레코드 aspnet_WebEvent_Events 가 있어야 합니다(그림 1 참조). 이 레코드에는 방금 발생한 런타임 오류에 대한 정보가 포함되어 있습니다.

테이블에 기록되는 오류 세부 정보를 보여 주는 스크린샷.

그림 1: 오류 세부 정보가 테이블에 기록되었습니다 aspnet_WebEvent_Events .
(전체 크기 이미지를 보려면 클릭)

웹 페이지에 오류 로그 표시

웹 사이트의 현재 구성을 사용하여 상태 모니터링 시스템은 처리되지 않은 모든 예외를 데이터베이스에 기록합니다. 그러나 상태 모니터링은 웹 페이지를 통해 오류 로그를 보는 메커니즘을 제공하지 않습니다. 그러나 데이터베이스에서 이 정보를 표시하는 ASP.NET 페이지를 작성할 수 있습니다. 잠시 후에는 전자 메일 메시지에서 오류 세부 정보를 보내도록 선택할 수 있습니다.

이러한 페이지를 만드는 경우 권한 있는 사용자만 오류 세부 정보를 볼 수 있도록 하는 단계를 수행해야 합니다. 사이트에서 이미 사용자 계정을 사용하는 경우 URL 권한 부여 규칙을 사용하여 페이지에 대한 액세스를 특정 사용자 또는 역할로 제한할 수 있습니다. 로그인한 사용자를 기반으로 웹 페이지에 대한 액세스 권한을 부여하거나 제한하는 방법에 대한 자세한 내용은 내 웹 사이트 보안 자습서를 참조하세요.

참고 항목

후속 자습서에서는 ELMAH라는 대체 오류 로깅 및 알림 시스템을 살펴봅니다. ELMAH에는 웹 페이지와 RSS 피드 모두에서 오류 로그를 보는 기본 제공 메커니즘이 포함되어 있습니다.

전자 메일에 이벤트 로깅

상태 모니터링 시스템에는 전자 메일 메시지에 이벤트를 "기록"하는 로그 원본 공급자가 포함되어 있습니다. 로그 원본에는 전자 메일 메시지 본문의 데이터베이스에 기록되는 것과 동일한 정보가 포함됩니다. 이 로그 원본을 사용하여 특정 상태 모니터링 이벤트가 발생할 때 개발자에게 알릴 수 있습니다.

예외가 발생할 때마다 전자 메일을 받을 수 있도록 Book Reviews 웹 사이트의 구성을 업데이트해 보겠습니다. 이 작업을 수행하려면 다음 세 가지 작업을 수행해야 합니다.

  1. 전자 메일을 보내도록 ASP.NET 웹 애플리케이션을 구성합니다. 이 작업은 구성 요소를 통해 <system.net> 전자 메일 메시지를 보내는 방법을 지정하여 수행됩니다. ASP.NET 애플리케이션에서 전자 메일 메시지를 보내는 방법에 대한 자세한 내용은 ASP.NETSystem.Net.Mail에서 전자 메일 보내기를 참조하세요.
  2. 요소에 전자 메일 로그 원본 공급자를 <providers> 등록하고
  3. "All Errors" 이벤트를 단계(2)에 추가된 로그 원본 공급자에 매핑하는 요소에 항목을 <rules> 추가합니다.

상태 모니터링 시스템에는 두 개의 이메일 로그 원본 공급자 클래스가 포함됩니다TemplatedMailWebEventProvider. SimpleMailWebEventProvider 클래스SimpleMailWebEventProvider 이벤트 세부 정보를 포함하고 전자 메일 본문의 사용자 지정을 거의 제공하지 않는 일반 텍스트 전자 메일 메시지를 보냅니다. 클래스TemplatedMailWebEventProvider 사용하여 렌더링된 태그가 전자 메일 메시지의 본문으로 사용되는 ASP.NET 페이지를 지정합니다. 이 클래스TemplatedMailWebEventProvider 전자 메일 메시지의 내용과 형식을 훨씬 더 잘 제어할 수 있지만 전자 메일 메시지 본문을 생성하는 ASP.NET 페이지를 만들어야 하므로 좀 더 선행 작업이 필요합니다. 이 자습서에서는 클래스 사용에 중점을 둡니다 SimpleMailWebEventProvider .

클래스에 대한 로그 원본을 포함하도록 파일의 <providers> 상태 모니터링 시스템 요소를 Web.config 업데이트합니다 SimpleMailWebEventProvider .

<providers>
  <clear />

  <add type="System.Web.Management.SimpleMailWebEventProvider"
  name="EmailWebEventProvider" buffer="false"
  from="support@example.com" to="support@example.com"
  subjectPrefix="Book Reviews Runtime Error: " />
  
  <add connectionStringName="ReviewsConnectionString" maxEventDetailsLength="1073741823"
  buffer="false" name="SqlWebEventProvider"
  type="System.Web.Management.SqlWebEventProvider" />
</providers>

위의 태그는 클래스를 SimpleMailWebEventProvider 로그 원본 공급자로 사용하고 이름을 "EmailWebEventProvider"로 할당합니다. 또한 이 특성에는 <add> 전자 메일 메시지의 받는 사람 및 보낸 사람 주소와 같은 추가 구성 옵션이 포함됩니다.

전자 메일 로그 원본이 정의되면 상태 모니터링 시스템에 이 원본을 사용하여 처리되지 않은 예외를 "기록"하도록 지시하기만 하면 됩니다. 이 작업은 섹션에서 새 규칙을 추가하여 수행됩니다 <rules> .

<rules>
  <clear />

  <add name="All Errors To Email" eventName="All Errors" provider="EmailWebEventProvider"
  profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00" />

  <add name="All Errors To Database" eventName="All Errors" provider="SqlWebEventProvider"
  profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00" />
</rules>

이제 섹션에는 <rules> 두 개의 규칙이 포함됩니다. "전자 메일에 대한 모든 오류"라는 첫 번째 예외는 처리되지 않은 모든 예외를 "EmailWebEventProvider" 로그 원본으로 보냅니다. 이 규칙은 웹 사이트의 오류에 대한 세부 정보를 지정된 To 주소로 보내는 효과가 있습니다. "데이터베이스에 대한 모든 오류" 규칙은 오류 세부 정보를 사이트의 데이터베이스에 기록합니다. 따라서 사이트에서 처리되지 않은 예외가 발생할 때마다 해당 세부 정보가 모두 데이터베이스에 기록되고 지정된 전자 메일 주소로 전송됩니다.

그림 2 는 방문할 때 클래스가 SimpleMailWebEventProvider 생성한 전자 메일을 Genre.aspx?ID=foo보여줍니다.

전자 메일 메시지에서 보낸 오류 세부 정보를 보여 주는 스크린샷.

그림 2: 오류 세부 정보가 전자 메일 메시지로 전송됨
(전체 크기 이미지를 보려면 클릭)

요약

ASP.NET 상태 모니터링 시스템은 관리자가 배포된 웹 애플리케이션의 상태를 모니터링할 수 있도록 설계되었습니다. 상태 모니터링 이벤트는 애플리케이션이 중지되는 경우, 사용자가 사이트에 성공적으로 로그온하는 경우 또는 처리되지 않은 예외가 발생하는 경우와 같은 특정 작업이 전개될 때 발생합니다. 이러한 이벤트는 로그 원본 수에 기록할 수 있습니다. 이 자습서에서는 처리되지 않은 예외의 세부 정보를 데이터베이스 및 이메일 메시지를 통해 기록하는 방법을 보여 줍니다.

이 자습서에서는 상태 모니터링을 사용하여 처리되지 않은 예외를 기록하는 데 중점을 두었지만 상태 모니터링은 배포된 ASP.NET 애플리케이션의 전반적인 상태를 측정하도록 설계되었으며 여기에서 탐색되지 않은 다양한 상태 모니터링 이벤트 및 로그 원본을 포함합니다. 또한 필요한 경우 자체 상태 모니터링 이벤트 및 로그 원본을 만들 수 있습니다. 상태 모니터링에 대해 자세히 알아보려는 경우 좋은 첫 번째 단계는 Erik Reitan상태 모니터링 FAQ를 읽는 것입니다. 그런 다음 방법: ASP.NET 2.0에서 상태 모니터 사용하세요.

행복한 프로그래밍!

추가 정보

이 자습서에서 설명하는 항목에 대한 자세한 내용은 다음 리소스를 참조하세요.