ELMAH를 사용하여 오류 세부 정보 로깅(VB)

작성자 : Scott Mitchell

ELMAH(오류 로깅 모듈 및 처리기)는 프로덕션 환경에서 런타임 오류를 로깅하는 또 다른 방법을 제공합니다. ELMAH는 오류 필터링 및 웹 페이지에서 오류 로그를 RSS 피드로 보거나 쉼표로 구분된 파일로 다운로드하는 기능을 포함하는 무료 오픈 소스 오류 로깅 라이브러리입니다. 이 자습서에서는 ELMAH 다운로드 및 구성을 안내합니다.

소개

이전 자습서에서는 ASP를 검사했습니다. 광범위한 웹 이벤트를 기록하기 위한 기본 라이브러리를 제공하는 NET의 상태 모니터링 시스템입니다. 많은 개발자가 상태 모니터링을 사용하여 처리되지 않은 예외의 세부 정보를 기록 및 메일로 보내줍니다. 그러나 이 시스템에는 몇 가지 문제가 있습니다. 무엇보다도 기록된 이벤트에 대한 정보를 볼 수 있는 모든 종류의 사용자 인터페이스가 부족하다는 것입니다. 10개의 마지막 오류에 대한 요약을 보거나 지난 주에 발생한 오류의 세부 정보를 보려면 데이터베이스를 찌르거나, 전자 메일 받은 편지함을 검색하거나, 테이블의 aspnet_WebEvent_Events 정보를 표시하는 웹 페이지를 빌드해야 합니다.

또 다른 통증 지점은 상태 모니터링의 복잡성을 중심으로 합니다. 상태 모니터링을 사용하여 다양한 이벤트를 기록할 수 있고 이벤트가 기록되는 방법과 시기를 지시하는 다양한 옵션이 있기 때문에 상태 모니터링 시스템을 올바르게 구성하는 것은 번거로운 작업이 될 수 있습니다. 마지막으로 호환성 문제가 있습니다. 상태 모니터링은 버전 2.0의 .NET Framework 처음 추가되었으므로 ASP.NET 버전 1.x를 사용하여 빌드된 이전 웹 애플리케이션에서는 사용할 수 없습니다. 또한 SqlWebEventProvider 이전 자습서에서 오류 세부 정보를 데이터베이스에 기록하는 데 사용한 클래스는 Microsoft SQL Server 데이터베이스에서만 작동합니다. XML 파일 또는 Oracle 데이터베이스와 같은 대체 데이터 저장소에 오류를 기록해야 하는 경우 사용자 지정 로그 공급자 클래스를 만들어야 합니다.

상태 모니터링 시스템의 대안은 Atif Aziz에서 만든 무료 오픈 소스 오류 로깅 시스템인 ELMAH(오류 로깅 모듈 및 처리기)입니다. 두 시스템 간의 가장 주목할 만한 차이점은 ELAMH가 오류 목록과 웹 페이지의 특정 오류 세부 정보를 RSS 피드로 표시하는 기능입니다. ELMAH는 오류만 기록하기 때문에 상태 모니터링보다 구성하기 쉽습니다. 또한 ELMAH는 ASP.NET 1.x, ASP.NET 2.0 및 ASP.NET 3.5 애플리케이션에 대한 지원을 포함하며 다양한 로그 원본 공급자와 함께 제공됩니다.

이 자습서에서는 ASP.NET 애플리케이션에 ELMAH를 추가하는 단계를 안내합니다. 그럼 시작하겠습니다.

참고

상태 모니터링 시스템과 ELMAH에는 모두 고유한 장단점 집합이 있습니다. 두 시스템을 모두 시도하고 요구 사항에 가장 적합한 시스템을 결정하는 것이 좋습니다.

ASP.NET 웹 애플리케이션에 ELMAH 추가

ELMAH를 신규 또는 기존 ASP.NET 애플리케이션에 통합하는 것은 5분 미만의 쉽고 간단한 프로세스입니다. 간단히 말해서 다음 네 가지 간단한 단계가 포함됩니다.

  1. ELMAH를 다운로드하고 웹 애플리케이션에 Elmah.dll 어셈블리를 추가합니다.
  2. 에서 Web.configELMAH의 HTTP 모듈 및 처리기를 등록합니다.
  3. ELMAH의 구성 옵션 지정 및
  4. 필요한 경우 오류 로그 원본 인프라를 만듭니다.

이 네 단계를 각각 한 번에 하나씩 살펴보겠습니다.

1단계: ELMAH 프로젝트 파일 다운로드 및 웹 애플리케이션에 추가Elmah.dll

작성 당시의 최신 버전인 ELMAH 1.0 BETA 3(빌드 10617)은 이 자습서에서 사용할 수 있는 다운로드에 포함되어 있습니다. 또는 ELMAH 웹 사이트를 방문하여 최신 버전을 얻거나 소스 코드를 다운로드할 수 있습니다. 데스크톱의 폴더에 ELMAH 다운로드를 추출하고 ELMAH 어셈블리 파일(Elmah.dll)을 찾습니다.

참고

파일은 Elmah.dll 다른 .NET Framework 버전 및 릴리스 및 디버그 빌드에 대한 하위 폴더가 있는 다운로드의 Bin 폴더에 있습니다. 적절한 프레임워크 버전에 릴리스 빌드를 사용합니다. instance 경우 ASP.NET 3.5 웹 애플리케이션을 Elmah.dll 빌드하는 경우 폴더에서 파일을 복사합니다Bin\net-3.5\Release.

그런 다음 Visual Studio를 열고 솔루션 탐색기 웹 사이트 이름을 마우스 오른쪽 단추로 클릭하고 상황에 맞는 메뉴에서 참조 추가를 선택하여 어셈블리를 프로젝트에 추가합니다. 그러면 참조 추가 대화 상자가 나타납니다. 찾아보기 탭으로 이동하여 파일을 선택합니다 Elmah.dll . 이 작업은 웹 애플리케이션의 Bin 폴더에 파일을 추가합니다Elmah.dll.

참고

WAP(웹 애플리케이션 프로젝트) 형식은 솔루션 탐색기 폴더를 표시 Bin 하지 않습니다. 대신 참조 폴더 아래에 이러한 항목이 나열됩니다.

어셈블리에는 Elmah.dll ELMAH 시스템에서 사용하는 클래스가 포함됩니다. 이러한 클래스는 다음 세 가지 범주 중 하나에 속합니다.

  • HTTP 모듈 - HTTP 모듈은 이벤트와 같은 Error 이벤트에 대한 HttpApplication 이벤트 처리기를 정의하는 클래스입니다. ELMAH에는 여러 HTTP 모듈이 포함되어 있으며, 가장 게르만인 세 가지 모듈은 다음과 같습니다.

    • ErrorLogModule - 처리되지 않은 예외를 로그 원본에 로그합니다.
    • ErrorMailModule - 전자 메일 메시지에서 처리되지 않은 예외의 세부 정보를 보냅니다.
    • ErrorFilterModule - 개발자 지정 필터를 적용하여 기록되는 예외와 무시되는 예외를 결정합니다.
  • HTTP 처리기 - HTTP 처리기는 특정 유형의 요청에 대한 태그를 생성하는 클래스입니다. ELMAH에는 오류 세부 정보를 웹 페이지, RSS 피드 또는 CSV(쉼표로 구분된 파일)로 렌더링하는 HTTP 처리기가 포함되어 있습니다.

  • 오류 로그 원본 - ELMAH는 메모리, Microsoft SQL Server 데이터베이스, Microsoft Access 데이터베이스, Oracle 데이터베이스, XML 파일, SQLite 데이터베이스 또는 Vista DB 데이터베이스에 오류를 기록할 수 있습니다. 상태 모니터링 시스템과 마찬가지로 ELMAH의 아키텍처는 공급자 모델을 사용하여 빌드되었습니다. 즉, 필요한 경우 사용자 지정 로그 원본 공급자를 만들고 원활하게 통합할 수 있습니다.

2단계: ELMAH의 HTTP 모듈 및 처리기 등록

Elmah.dll 파일에는 처리되지 않은 예외를 자동으로 기록하고 웹 페이지의 오류 세부 정보를 표시하는 데 필요한 HTTP 모듈 및 처리기가 포함되어 있지만 웹 애플리케이션의 구성에 명시적으로 등록해야 합니다. HTTP 모듈이 ErrorLogModule 등록되면 의 Error 이벤트를 구독합니다HttpApplication. 이 이벤트가 발생할 ErrorLogModule 때마다 지정된 로그 원본에 예외의 세부 정보를 기록합니다. 다음 섹션인 "ELMAH 구성"에서 로그 원본 공급자를 정의하는 방법을 살펴보겠습니다. ErrorLogPageFactory HTTP 처리기 팩터리는 웹 페이지에서 오류 로그를 볼 때 태그를 생성합니다.

HTTP 모듈 및 처리기를 등록하기 위한 특정 구문은 사이트에 전원을 공급하는 웹 서버에 따라 달라집니다. ASP.NET 개발 서버 및 Microsoft의 IIS 버전 6.0 이하의 경우 요소 내에 <system.web> 표시되는 및 섹션에 <httpModules> HTTP 모듈 및 <httpHandlers> 처리기가 등록됩니다. IIS 7.0을 사용하는 경우 요소 및 <modules><handlers> 섹션에 <system.webServer> 등록해야 합니다. 다행히 사용 중인 웹 서버에 관계없이 위치에서 HTTP 모듈 및 처리기를 정의할 수 있습니다. 이 옵션은 사용 중인 웹 서버에 관계없이 개발 및 프로덕션 환경에서 동일한 구성을 사용할 수 있으므로 가장 이식 가능한 옵션입니다.

먼저 의 ErrorLogModule 및 섹션에서 <system.web>HTTP 모듈 및 <httpHandlers>ErrorLogPageFactory HTTP 처리기를 <httpModules> 등록합니다. 구성에서 이러한 두 요소를 이미 정의한 경우 ELMAH의 HTTP 모듈 및 처리기에 대한 요소를 포함 <add> 하기만 하면 됩니다.

<?xml version="1.0"?>
<configuration>
  ...
  
  <system.web>
  ...

  <httpHandlers>
  ...

  <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
  </httpHandlers>
  
  <httpModules>
  ...
  
  <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>
  </httpModules>

  ...
  </system.web>

  ...
</configuration>

다음으로 요소에 ELMAH의 HTTP 모듈 및 처리기를 등록합니다 <system.webServer> . 이전과 마찬가지로 이 요소가 구성에 아직 없는 경우 추가합니다.

<?xml version="1.0"?>
<configuration>
  ...

  <system.webServer>
  <validation validateIntegratedModeConfiguration="false"/>
  <modules>
  ...

  <add name="Elmah.ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
  </modules>
  <handlers>
  ...

  <add name="Elmah" path="elmah.axd" verb="POST,GET,HEAD" type="Elmah.ErrorLogPageFactory, Elmah" preCondition="integratedMode" />
  </handlers>
  </system.webServer>
</configuration>

기본적으로 IIS 7은 HTTP 모듈 및 처리기가 섹션에 <system.web> 등록된 경우 불만을 제기합니다. 요소의 <validation> 특성은 validateIntegratedModeConfiguration IIS 7에 이러한 오류 메시지를 표시하지 말도록 지시합니다.

HTTP 처리기를 등록하기 ErrorLogPageFactory 위한 구문에는 로 설정된 elmah.axd특성이 포함되어 path 있습니다. 이 특성은 라는 elmah.axd 페이지에 대한 요청이 도착하면 HTTP 처리기에서 요청을 처리해야 한다고 웹 애플리케이션에 ErrorLogPageFactory 알릴 수 있습니다. 이 자습서의 뒷부분 ErrorLogPageFactory 에서 HTTP 처리기가 작동하는 것을 볼 수 있습니다.

3단계: ELMAH 구성

ELMAH는 라는 <elmah>사용자 지정 구성 섹션의 Web.config 웹 사이트 파일에서 해당 구성 옵션을 찾습니다. 사용자 지정 섹션 Web.config 을 사용하려면 먼저 요소에 <configSections> 정의해야 합니다. Web.config 파일을 열고 에 다음 태그를 <configSections>추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
  ...

  <sectionGroup name="elmah">
  <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah"/>
  <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" />
  <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
  <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah"/>
  </sectionGroup>
  </configSections>

  ...
</configuration>

참고

ASP.NET 1.x 애플리케이션에 대해 ELMAH를 구성하는 경우 위의 요소에서 <section> 특성을 제거 requirePermission="false" 합니다.

위의 구문은 사용자 지정 <elmah> 섹션과 해당 하위 섹션( , , <errorLog><errorMail><errorFilter>)을 등록합니다<security>.

다음으로 섹션을 에 <elmah> 추가합니다 Web.config. 이 섹션은 요소와 동일한 수준에 <system.web> 표시됩니다. 섹션 내에 <elmah> 다음과 같은 및 <errorLog> 섹션을 <security> 추가합니다.

<?xml version="1.0"?>
<configuration>
  ...

  <elmah>
  <security allowRemoteAccess="0" />
  
  <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="ReviewsConnectionString" />
  </elmah>

  ...
</configuration>

섹션의 allowRemoteAccess 특성은 <security> 원격 액세스가 허용되는지 여부를 나타냅니다. 이 값을 0으로 설정하면 오류 로그 웹 페이지를 로컬로만 볼 수 있습니다. 이 특성을 1로 설정하면 원격 및 로컬 방문자 모두에 대해 오류 로그 웹 페이지가 사용하도록 설정됩니다. 지금은 원격 방문자에 대한 오류 로그 웹 페이지를 사용하지 않도록 설정해 보겠습니다. 나중에 원격 액세스를 허용하여 보안 문제를 논의할 수 있습니다.

섹션은 <errorLog> 오류 세부 정보가 기록되는 위치를 지정하는 오류 로그 원본을 정의합니다. 상태 모니터링 시스템의 섹션과 비슷합니다 <providers> . 위의 구문은 클래스를 SqlErrorLog 오류 로그 원본으로 지정하여 특성을 통해 지정된 Microsoft SQL Server 데이터베이스에 connectionStringName 오류를 기록합니다.

참고

ELMAH는 XML 파일, Microsoft Access 데이터베이스, Oracle 데이터베이스 및 기타 데이터 저장소에 오류를 기록하는 데 사용할 수 있는 추가 오류 로그 공급자와 함께 제공됩니다. 이러한 대체 오류 로그 공급자를 사용하는 방법에 대한 자세한 내용은 ELMAH 다운로드에 포함된 샘플 Web.config 파일을 참조하세요.

4단계: 오류 로그 원본 인프라 만들기

ELMAH의 SqlErrorLog 공급자는 지정된 Microsoft SQL Server 데이터베이스에 오류 세부 정보를 기록합니다. 공급자는 SqlErrorLog 이 데이터베이스에 라는 ELMAH_Error 테이블과 세 개의 저장 프로시저, 즉 ELMAH_GetErrorsXml, ELMAH_GetErrorXmlELMAH_LogError가 있어야 합니다. ELMAH 다운로드에는 이 테이블 및 이러한 저장 프로시저를 만들기 위한 T-SQL이 포함된 폴더에 라는 SQLServer.sqldb 파일이 포함되어 있습니다. 공급자를 사용 SqlErrorLog 하려면 데이터베이스에서 이러한 문을 실행해야 합니다.

그림 12는 공급자가 필요로 하는 데이터베이스 개체가 추가된 SqlErrorLog 후 Visual Studio의 데이터베이스 Explorer 보여 줍니다.

S QL 오류 로그 공급자 로그 오류가 있는 ELMAH 오류 테이블을 보여 주는 스크린샷

그림 1: 공급자가 SqlErrorLog 테이블에 오류를 ELMAH_Error 기록합니다.

S QL 오류 로그 공급자가 세 가지 저장 프로시저를 사용하는 방법을 보여 주는 스크린샷

그림 2: 공급자가 SqlErrorLog 세 가지 저장 프로시저를 사용합니다.

ELMAH 작동 중

이 시점에서 웹 애플리케이션에 ELMAH를 추가하고, HTTP 모듈 및 HTTP 처리기를 등록 ErrorLogModule 하고 ErrorLogPageFactory , 에서 Web.configELMAH의 구성 옵션을 지정하고, 오류 로그 공급자에 필요한 데이터베이스 개체를 SqlErrorLog 추가했습니다. 이제 ELMAH가 작동하는 것을 볼 준비가 되었습니다! 책 검토 웹 사이트를 방문하여 런타임 오류(예: Genre.aspx?ID=foo) 또는 존재하지 않는 페이지(예: NoSuchPage.aspx)를 생성하는 페이지를 방문합니다. 이러한 페이지를 방문할 때 표시되는 내용은 구성 및 로컬 또는 원격으로 방문하는지에 따라 달라집니다 <customErrors> . (이 항목에 대한 새로 고침은 사용자 지정 오류 페이지 표시 자습서 를 참조하세요.)

ELMAH는 처리되지 않은 예외가 발생할 때 사용자에게 표시되는 콘텐츠에 영향을 주지 않습니다. 세부 정보만 기록합니다. 이 오류 로그는 웹 사이트의 루트(예: http://localhost/BookReviews/elmah.axd)에서 웹 페이지에서 elmah.axd 액세스할 수 있습니다. (이 파일은 프로젝트에 물리적으로 존재하지 않지만 런타임에 대한 elmah.axd 요청이 들어오면 HTTP 처리기로 디스패치 ErrorLogPageFactory 되어 브라우저로 다시 전송되는 태그를 생성합니다.)

참고

페이지를 사용하여 elmah.axd ELMAH에 테스트 오류를 생성하도록 지시할 수도 있습니다. elmah.axd/test 를 방문하면 ELMAH가 http://localhost/BookReviews/elmah.axd/test형식Elmah.TestException의 예외를 throw합니다. "이것은 안전하게 무시될 수 있는 테스트 예외입니다."라는 오류 메시지가 표시됩니다.

그림 3 은 개발 환경에서 방문할 때의 오류 로그를 elmah.axd 보여줍니다.

웹 페이지의 오류 로그를 표시하는 스크린샷

그림 3: Elmah.axd 웹 페이지의 오류 로그 표시
(전체 크기 이미지를 보려면 클릭)

그림 3의 오류 로그에는 6개의 오류 항목이 포함되어 있습니다. 각 항목에는 HTTP 상태 코드(이러한 오류의 경우 404 또는 500), 형식, 설명, 오류가 발생했을 때 로그온한 사용자의 이름, 날짜 및 시간이 포함됩니다. 세부 정보 링크를 클릭하면 오류 발생 시 서버 변수 값과 함께 오류 세부 정보 노란색 사망 화면( 그림 4 참조)에 표시된 것과 동일한 오류 메시지가 포함된 페이지가 표시됩니다( 그림 5 참조). HTTP POST 헤더의 값과 같은 추가 정보가 포함된 오류 세부 정보가 저장된 원시 XML을 볼 수도 있습니다.

오류 세부 정보 YS OD를 볼 수 있음을 보여 주는 스크린샷

그림 4: 오류 세부 정보 YSOD 보기
(전체 크기 이미지를 보려면 클릭)

오류 발생 시 서버 변수 컬렉션의 값을 탐색하는 방법을 보여 주는 스크린샷

그림 5: 오류 발생 시 서버 변수 컬렉션의 값 살펴보기
(전체 크기 이미지를 보려면 클릭)

프로덕션 웹 사이트에 ELMAH를 배포하려면 다음이 수반됩니다.

  • 프로덕션의 Elmah.dll 폴더에 Bin 파일 복사
  • ELMAH 관련 구성 설정을 Web.config 프로덕션에 사용되는 파일에 복사하고
  • 오류 로그 원본 인프라를 프로덕션 데이터베이스에 추가합니다.

이전 자습서에서는 개발에서 프로덕션으로 파일을 복사하는 기술을 살펴보았습니다. 프로덕션 데이터베이스에서 오류 로그 원본 인프라를 가져오는 가장 쉬운 방법은 SQL Server Management Studio 사용하여 프로덕션 데이터베이스에 연결한 다음 스크립트 파일을 실행 SqlServer.sql 하여 필요한 테이블 및 저장 프로시저를 만드는 것입니다.

프로덕션에서 오류 세부 정보 페이지 보기

프로덕션에 사이트를 배포한 후 프로덕션 웹 사이트를 방문하여 처리되지 않은 예외를 생성합니다. 개발 환경에서와 마찬가지로 ELMAH는 처리되지 않은 예외가 발생할 때 표시되는 오류 페이지에 영향을 주지 않습니다. 대신 오류만 기록합니다. 프로덕션 환경에서 오류 로그 페이지(elmah.axd)를 방문하려고 하면 그림 6에 표시된 사용할 수 없음 페이지가 표시됩니다.

기본적으로 원격 방문자가 오류 로그 웹 페이지를 볼 수 없는 방법을 보여 주는 스크린샷

그림 6: 기본적으로 원격 방문자는 오류 로그 웹 페이지를 볼 수 없습니다.
(전체 크기 이미지를 보려면 클릭)

ELMAH 구성의 <security> 섹션에서 특성을 0으로 설정 allowRemoteAccess 하여 원격 사용자가 오류 로그를 볼 수 없도록 합니다. 오류 세부 정보가 보안 취약성 또는 기타 중요한 정보를 표시할 수 있으므로 익명 방문자가 오류 로그를 보지 못하도록 하는 것이 중요합니다. 이 특성을 1로 설정하고 오류 로그에 대한 원격 액세스를 사용하도록 설정하려는 경우 권한 있는 방문자만 액세스할 수 있도록 경로를 잠그 elmah.axd 는 것이 중요합니다. 이 작업은 파일에 요소를 Web.config 추가하여 <location> 수행할 수 있습니다.

다음 구성은 관리 역할의 사용자만 오류 로그 웹 페이지에 액세스할 수 있도록 허용합니다.

<?xml version="1.0"?>
<configuration>
  ...

  <elmah>
  <security allowRemoteAccess="1" />
  
  ...
  </elmah>

  ...

  <location path="elmah.axd">
  <system.web>
  <authorization>
  <allow roles="Admin" />
  <deny users="*" />
  </authorization>
  </system.web>  
  </location>
</configuration>

참고

관리 역할과 시스템의 세 사용자(Scott, Jisun 및 Alice)가 Application Services를 사용하는 웹 사이트 구성 자습서에 추가되었습니다. 사용자 Scott과 Jisun은 관리 역할의 멤버입니다. 인증 및 권한 부여에 대한 자세한 내용은 내 웹 사이트 보안 자습서를 참조하세요.

이제 원격 사용자가 프로덕션 환경에 대한 오류 로그를 볼 수 있습니다. 오류 로그 웹 페이지의 스크린샷 은 그림 3, 45 를 참조하세요. 그러나 익명 또는 비 관리 사용자가 오류 로그 페이지를 보려고 하면 그림 7과 같이 로그인 페이지(Login.aspx)로 자동으로 리디렉션됩니다.

권한이 없는 사용자가 로그인 페이지로 자동으로 리디렉션되는 것을 보여 주는 스크린샷

그림 7: 권한이 없는 사용자가 로그인 페이지로 자동으로 리디렉션됨
(전체 크기 이미지를 보려면 클릭)

프로그래밍 방식으로 로깅 오류

ELMAH의 ErrorLogModule HTTP 모듈은 처리되지 않은 예외를 지정된 로그 원본에 자동으로 기록합니다. 또는 클래스 및 해당 메서드를 사용하여 ErrorSignal 처리되지 않은 예외를 발생하지 않고도 오류를 기록할 Raise 수 있습니다. 메서드는 Raise 개체를 Exception 전달하고 해당 예외가 throw되고 처리되지 않고 ASP.NET 런타임에 도달한 것처럼 기록합니다. 그러나 차이점은 메서드가 호출된 후에도 Raise 요청이 정상적으로 실행되는 반면, 처리되지 않은 throw된 예외는 요청의 정상적인 실행을 방해하고 ASP.NET 런타임이 구성된 오류 페이지를 표시하게 한다는 것입니다.

클래스는 ErrorSignal 실패할 수 있는 일부 작업이 있는 상황에서 유용하지만 해당 실패는 수행 중인 전체 작업에 치명적이지 않습니다. instance 경우 웹 사이트에는 사용자의 입력을 받아 데이터베이스에 저장한 다음 사용자에게 정보가 처리되었음을 알리는 전자 메일을 보내는 양식이 포함될 수 있습니다. 정보가 데이터베이스에 성공적으로 저장되지만 전자 메일 메시지를 보낼 때 오류가 발생하면 어떻게 해야 하나요? 한 가지 옵션은 예외를 throw하고 사용자를 오류 페이지로 보내는 것입니다. 그러나 이렇게 하면 사용자가 입력한 정보가 저장되지 않았다고 생각하게 될 수 있습니다. 또 다른 방법은 전자 메일 관련 오류를 기록하지만 사용자의 환경을 어떤 식으로든 변경하지 않는 것입니다. 클래스가 ErrorSignal 유용한 위치입니다.

' ... Save user's information to the database ...
...
' Attempt to send the user a confirmation email
    ' ... Send an email ...
Try
Catch e As Exception
' Error in sending email. Log it!
ErrorSignal.FromCurrentContext().Raise(e)
End Try

Email 통한 오류 알림

데이터베이스에 대한 로깅 오류와 함께 ELMAH는 지정된 받는 사람에게 오류 세부 정보를 전자 메일로 보내도록 구성할 수도 있습니다. 이 기능은 HTTP 모듈에서 ErrorMailModule 제공되므로 이메일을 통해 오류 세부 정보를 보내려면 이 HTTP 모듈 Web.config 을 등록해야 합니다.

<?xml version="1.0"?>
<configuration>
  ...
  
  <system.web>
  ...

  <httpModules>
  ...
  
  <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>
  <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah"/>
  </httpModules>
  </system.web>

  <system.webServer>
  <validation validateIntegratedModeConfiguration="false"/>
  <modules>
  ...

  <add name="Elmah.ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
  <add name="Elmah.ErrorMail" type="Elmah.ErrorMailModule" preCondition="managedHandler" />
  </modules>
  
  ...
  </system.webServer>
</configuration>

다음으로, 요소 섹션의 <errorMail> 오류 전자 메일에 <elmah> 대한 정보를 지정하여 전자 메일의 보낸 사람 및 받는 사람, 제목 및 전자 메일이 비동기적으로 전송되는지 여부를 나타냅니다.

<?xml version="1.0"?>
<configuration>
  ...

  <elmah>
  ...

  <errorMail from="support@example.com"
  to="support@example.com"
  subject="Book Reviews Runtime Error"
  async="true" />
  </elmah>

  ...
</configuration>

위의 설정을 사용하면 런타임 오류가 발생할 때마다 ELMAH는 오류 세부 정보가 포함된 이메일을 에 support@example.com 보냅니다. ELMAH의 오류 전자 메일에는 오류 세부 정보 웹 페이지에 표시된 것과 동일한 정보, 즉 오류 메시지, 스택 추적 및 서버 변수( 그림 45 참조)가 포함됩니다. 오류 전자 메일에는 예외 세부 정보 노란색 죽음의 화면 콘텐츠가 첨부 파일(YSOD.html)로 포함됩니다.

그림 8 은 를 방문하여 Genre.aspx?ID=foo생성된 ELMAH의 오류 이메일을 보여줍니다. 그림 8은 오류 메시지와 스택 추적만 보여 주지만 서버 변수는 전자 메일 본문에 추가로 포함됩니다.

메일을 통해 오류 세부 정보를 보내도록 ELMAH를 구성하는 방법을 보여 주는 스크린샷

그림 8: Email 통해 오류 세부 정보를 보내도록 ELMAH를 구성할 수 있습니다.
(전체 크기 이미지를 보려면 클릭)

관심 있는 로깅 오류만

기본적으로 ELMAH는 404 및 기타 HTTP 오류를 포함하여 처리되지 않은 모든 예외의 세부 정보를 기록합니다. 오류 필터링을 사용하여 이러한 오류 또는 다른 유형의 오류를 무시하도록 ELMAH에 지시할 수 있습니다. 필터링 논리는 필터링 논리를 사용하기 위해 등록 Web.config 해야 하는 ELMAH의 ErrorFilterModule HTTP 모듈에 의해 수행됩니다. 필터링 규칙은 섹션에 <errorFilter> 지정됩니다.

다음 태그는 ELMAH에 404 오류를 기록하지 않도록 지시합니다.

<?xml version="1.0"?>
<configuration>
  ...

  <elmah>
  ...

  <errorFilter>
  <test>
  <equal binding="HttpStatusCode" value="404" type="Int32" />
  </test>
  </errorFilter>
  </elmah>

  ...
</configuration>

참고

오류 필터링을 사용하려면 HTTP 모듈을 등록 ErrorFilterModule 해야 합니다.

<equal> 섹션 내의 <test> 요소를 어설션이라고 합니다. 어설션이 true로 평가되면 ELMAH의 로그에서 오류가 필터링됩니다. , , , <lesser-or-equal><lesser><not-equal><greater-or-equal>, 등과 같은 <greater>다른 어설션을 사용할 수 있습니다. 및 <or> 부울 연산자를 사용하여 어설션을 결합할 <and> 수도 있습니다. 또한 간단한 JavaScript 식을 어설션으로 포함하거나 C# 또는 Visual Basic에서 고유한 어설션을 작성할 수도 있습니다.

ELMAH의 오류 필터링 기능에 대한 자세한 내용은 ELMAH wiki오류 필터링 섹션을 참조하세요.

요약

ELMAH는 ASP.NET 웹 애플리케이션에서 오류를 로깅하기 위한 간단하면서도 강력한 메커니즘을 제공합니다. Microsoft의 상태 모니터링 시스템과 마찬가지로 ELMAH는 데이터베이스에 오류를 기록할 수 있으며 이메일을 통해 개발자에게 오류 세부 정보를 보낼 수 있습니다. 상태 모니터링 시스템과 달리 ELMAH에는 Microsoft SQL Server, Microsoft Access, Oracle, XML 파일 등 다양한 오류 로그 데이터 저장소에 대한 기본 지원이 포함되어 있습니다. 또한 ELMAH는 오류 로그를 보기 위한 기본 제공 메커니즘과 웹 페이지의 특정 오류에 대한 세부 정보( elmah.axd)를 제공합니다. 이 페이지에서는 elmah.axd 오류 정보를 RSS 피드로 렌더링하거나 Microsoft Excel을 사용하여 읽을 수 있는 CSV(쉼표로 구분된 값 파일)로 렌더링할 수도 있습니다. 선언적 또는 프로그래밍 방식 어설션을 사용하여 로그에서 오류를 필터링하도록 ELMAH에 지시할 수도 있습니다. 또한 ELMAH는 ASP.NET 버전 1.x 애플리케이션과 함께 사용할 수 있습니다.

배포된 모든 애플리케이션에는 처리되지 않은 예외를 자동으로 로깅하고 개발 팀에 알림을 보내기 위한 몇 가지 메커니즘이 있어야 합니다. 상태 모니터링 또는 ELMAH를 사용하여 수행되는지 여부는 보조입니다. 즉, 상태 모니터링을 사용하든 ELMAH를 사용하든 상관없습니다. 두 시스템을 모두 평가한 다음 요구 사항에 가장 적합한 시스템을 선택합니다. 근본적으로 중요한 것은 프로덕션 환경에서 처리되지 않은 예외를 기록하기 위해 일부 메커니즘을 배치한다는 것입니다.

행복한 프로그래밍!

추가 정보

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