Freigeben über


Protokollieren von Fehlerdetails mit ELMAH (C#)

von Scott Mitchell

Fehlerprotokollierungsmodule und -Handler (ELMAH) bietet einen weiteren Ansatz zum Protokollieren von Laufzeitfehlern in einer Produktionsumgebung. ELMAH ist eine kostenlose, Open Source Fehlerprotokollierungsbibliothek, die Funktionen wie Fehlerfilterung und die Möglichkeit enthält, das Fehlerprotokoll von einer Webseite als RSS-Feed anzuzeigen oder als durch Trennzeichen getrennte Datei herunterzuladen. In diesem Tutorial erfahren Sie, wie Sie ELMAH herunterladen und konfigurieren.

Einführung

Im vorherigen Tutorial wurde ASP. NET-System zur Integritätsüberwachung, das eine sofort einsatzbereite Bibliothek zum Aufzeichnen einer vielzahl von Webereignissen bietet. Viele Entwickler verwenden die Integritätsüberwachung, um details zu nicht behandelten Ausnahmen zu protokollieren und per E-Mail zu senden. Es gibt jedoch einige Probleme mit diesem System. In erster Linie fehlt jegliche Benutzeroberfläche zum Anzeigen von Informationen über die protokollierten Ereignisse. Wenn Sie eine Zusammenfassung der letzten 10 Fehler oder die Details eines Fehlers anzeigen möchten, der letzte Woche aufgetreten ist, müssen Sie entweder die Datenbank durchsuchen, Ihren E-Mail-Posteingang durchsuchen oder eine Webseite erstellen, auf der Informationen aus der aspnet_WebEvent_Events Tabelle angezeigt werden.

Ein weiterer Problempunkt ist die Komplexität der Integritätsüberwachung. Da die Integritätsüberwachung verwendet werden kann, um eine Vielzahl verschiedener Ereignisse aufzuzeichnen, und da es eine Vielzahl von Optionen gibt, um anzugeben, wie und wann Ereignisse protokolliert werden, kann das richtige Konfigurieren des System für die Integritätsüberwachung eine mühsame Aufgabe sein. Schließlich gibt es Kompatibilitätsprobleme. Da die Integritätsüberwachung in Version 2.0 zum .NET Framework hinzugefügt wurde, ist sie für ältere Webanwendungen, die mit ASP.NET Version 1.x erstellt wurden, nicht verfügbar. Darüber hinaus funktioniert die SqlWebEventProvider -Klasse, die wir im vorherigen Tutorial zum Protokollieren von Fehlerdetails in einer Datenbank verwendet haben, nur mit Microsoft SQL Server-Datenbanken. Sie müssen eine benutzerdefinierte Protokollanbieterklasse erstellen, wenn Sie Fehler in einem alternativen Datenspeicher protokollieren müssen, z. B. in einer XML-Datei oder einer Oracle-Datenbank.

Eine Alternative zum System zur Integritätsüberwachung ist Error Logging Modules And Handlers (ELMAH), ein kostenloses Open-Source-Fehlerprotokollierungssystem, das von Atif Aziz erstellt wurde. Der wichtigste Unterschied zwischen den beiden Systemen ist die Fähigkeit von ELAMH, eine Liste von Fehlern und die Details eines bestimmten Fehlers von einer Webseite und als RSS-Feed anzuzeigen. ELMAH ist einfacher zu konfigurieren als die Integritätsüberwachung, da nur Fehler protokolliert werden. Darüber hinaus unterstützt ELMAH ASP.NET 1.x, ASP.NET 2.0 und ASP.NET 3.5-Anwendungen und wird mit einer Vielzahl von Protokollquellenanbietern ausgeliefert.

In diesem Tutorial werden die Schritte zum Hinzufügen von ELMAH zu einer ASP.NET-Anwendung beschrieben. Jetzt geht‘s los!

Hinweis

Das System für die Integritätsüberwachung und ELMAH haben beide ihre eigenen Vor- und Nachteile. Ich ermutige Sie, beide Systeme auszuprobieren und zu entscheiden, welche am besten zu Ihren Anforderungen passt.

Hinzufügen von ELMAH zu einer ASP.NET-Webanwendung

Die Integration von ELMAH in eine neue oder vorhandene ASP.NET Anwendung ist ein einfacher und unkomplizierter Prozess, der weniger als fünf Minuten dauert. Kurz gesagt, umfasst es vier einfache Schritte:

  1. Laden Sie ELMAH herunter, und fügen Sie die Elmah.dll Assembly Ihrer Webanwendung hinzu.
  2. Registrieren Sie die HTTP-Module und den Handler von ELMAH in Web.config,
  3. Geben Sie die Konfigurationsoptionen von ELMAH an, und
  4. Erstellen Sie bei Bedarf die Fehlerprotokollquellinfrastruktur.

Lassen Sie uns jeden dieser vier Schritte einzeln durchlaufen.

Schritt 1: Herunterladen der ELMAH-Projektdateien und HinzufügenElmah.dllzu Ihrer Webanwendung

ELMAH 1.0 BETA 3 (Build 10617), die neueste Version zum Zeitpunkt des Schreibens, ist im Download enthalten, der in diesem Tutorial verfügbar ist. Alternativ können Sie die ELMAH-Website besuchen, um die neueste Version zu erhalten oder den Quellcode herunterzuladen. Extrahieren Sie den ELMAH-Download in einen Ordner auf Ihrem Desktop, und suchen Sie die ELMAH-Assemblydatei (Elmah.dll).

Hinweis

Die Elmah.dll Datei befindet sich im Ordner des Downloads, der Unterordner für verschiedene .NET Framework Versionen sowie für Release- und Debugbuilds Bin enthält. Verwenden Sie den Releasebuild für die entsprechende Frameworkversion. Wenn Sie für instance eine ASP.NET 3.5-Webanwendung erstellen, kopieren Sie die Elmah.dll Datei aus dem Bin\net-3.5\Release Ordner.

Öffnen Sie als Nächstes Visual Studio, und fügen Sie die Assembly ihrem Projekt hinzu, indem Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Websitenamen klicken und im Kontextmenü Verweis hinzufügen auswählen. Dadurch wird das Dialogfeld Verweis hinzufügen angezeigt. Navigieren Sie zur Registerkarte Durchsuchen, und wählen Sie die Elmah.dll Datei aus. Durch diese Aktion wird die Elmah.dll Datei dem Ordner der Webanwendung Bin hinzugefügt.

Hinweis

Der WAP-Typ (Web Application Project) zeigt den Bin Ordner im Projektmappen-Explorer nicht an. Stattdessen werden diese Elemente im Ordner Verweise aufgelistet.

Die Elmah.dll Assembly enthält die klassen, die vom ELMAH-System verwendet werden. Diese Klassen fallen in eine von drei Kategorien:

  • HTTP-Module : Ein HTTP-Modul ist eine Klasse, die Ereignishandler für HttpApplication Ereignisse definiert, z. B. das Error -Ereignis. ELMAH umfasst mehrere HTTP-Module, die drei am häufigsten:

    • ErrorLogModule – protokolliert nicht behandelte Ausnahmen für eine Protokollquelle.
    • ErrorMailModule – sendet die Details einer nicht behandelten Ausnahme in einer E-Mail-Nachricht.
    • ErrorFilterModule – wendet vom Entwickler angegebene Filter an, um zu bestimmen, welche Ausnahmen protokolliert und welche ignoriert werden.
  • HTTP-Handler : Ein HTTP-Handler ist eine Klasse, die für das Generieren des Markups für einen bestimmten Anforderungstyp verantwortlich ist. ELMAH enthält HTTP-Handler, die Fehlerdetails als Webseite, als RSS-Feed oder als durch Trennzeichen getrennte Datei (CSV) rendern.

  • Fehlerprotokollquellen: Standardmäßig kann ELMAH Fehler im Arbeitsspeicher, in einer Microsoft SQL Server-Datenbank, einer Microsoft Access-Datenbank, einer Oracle-Datenbank, einer XML-Datei, einer SQLite-Datenbank oder einer Vista DB-Datenbank protokollieren. Wie das System zur Integritätsüberwachung wurde auch die ELMAH-Architektur mithilfe des Anbietermodells erstellt, sodass Sie bei Bedarf ihre eigenen benutzerdefinierten Protokollquellenanbieter erstellen und nahtlos integrieren können.

Schritt 2: Registrieren des HTTP-Moduls und -Handlers von ELMAH

Elmah.dll Die Datei enthält zwar die HTTP-Module und den Handler, die zum automatischen Protokollieren nicht behandelter Ausnahmen und zum Anzeigen von Fehlerdetails von einer Webseite erforderlich sind, diese müssen jedoch explizit in der Konfiguration der Webanwendung registriert werden. Das ErrorLogModule HTTP-Modul abonniert nach der Registrierung das HttpApplication-Ereignis des Error . Jedes Mal, wenn dieses Ereignis ausgelöst wird, ErrorLogModule werden die Details der Ausnahme zu einer angegebenen Protokollquelle protokolliert. Im nächsten Abschnitt ,Konfigurieren von ELMAH" erfahren Sie, wie Sie den Protokollquellenanbieter definieren. Die ErrorLogPageFactory HTTP-Handlerfactory ist für das Generieren des Markups beim Anzeigen des Fehlerprotokolls von einer Webseite verantwortlich.

Die spezifische Syntax zum Registrieren von HTTP-Modulen und -Handlern hängt vom Webserver ab, der die Website mit Energie versorgt. Für den ASP.NET Development Server und microsoft IIS Version 6.0 und früher werden HTTP-Module und -Handler in den <httpModules> Abschnitten und <httpHandlers> registriert, die innerhalb des <system.web> -Elements angezeigt werden. Wenn Sie IIS 7.0 verwenden, müssen diese in den Abschnitten und <handlers> des <system.webServer> Elements <modules> registriert werden. Glücklicherweise können Sie die HTTP-Module und -Handler an beiden Stellen definieren, unabhängig vom verwendeten Webserver. Diese Option ist die portabelste, da sie die Verwendung derselben Konfiguration in den Entwicklungs- und Produktionsumgebungen ermöglicht, unabhängig vom verwendeten Webserver.

Registrieren Sie zunächst das ErrorLogModule HTTP-Modul und den ErrorLogPageFactory HTTP-Handler im <httpModules> Abschnitt und <httpHandlers> in <system.web>. Wenn Ihre Konfiguration diese beiden Elemente bereits definiert, schließen Sie einfach das Element für das <add> HTTP-Modul und den Handler von ELMAH ein.

<?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>

Registrieren Sie als Nächstes das HTTP-Modul und den Handler von ELMAH im <system.webServer> -Element. Wenn dieses Element noch nicht in Ihrer Konfiguration vorhanden ist, fügen Sie es wie zuvor hinzu.

<?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>

Standardmäßig beschwert sich IIS 7, wenn HTTP-Module und -Handler im <system.web> Abschnitt registriert sind. Das validateIntegratedModeConfiguration -Attribut im <validation> -Element weist IIS 7 an, solche Fehlermeldungen zu unterdrücken.

Beachten Sie, dass die Syntax zum Registrieren des ErrorLogPageFactory HTTP-Handlers ein path -Attribut enthält, das auf elmah.axdfestgelegt ist. Dieses Attribut informiert die Webanwendung darüber, dass die Anforderung vom ErrorLogPageFactory HTTP-Handler verarbeitet werden soll, wenn eine Anforderung für eine Seite namens elmah.axd eingeht. Der HTTP-Handler wird ErrorLogPageFactory später in diesem Tutorial in Aktion angezeigt.

Schritt 3: Konfigurieren von ELMAH

ELMAH sucht in der Datei der Website Web.config in einem benutzerdefinierten Konfigurationsabschnitt namens <elmah>nach seinen Konfigurationsoptionen. Um einen benutzerdefinierten Abschnitt darin Web.config verwenden zu können, muss zuerst im <configSections> -Element definiert werden. Öffnen Sie die Web.config Datei, und fügen Sie dem das folgende Markup hinzu <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>

Hinweis

Wenn Sie ELMAH für eine ASP.NET 1.x-Anwendung konfigurieren, entfernen Sie das requirePermission="false" Attribut aus den <section> oben genannten Elementen.

Die obige Syntax registriert den benutzerdefinierten <elmah> Abschnitt und seine Unterabschnitte: <security>, <errorLog>, <errorMail>und <errorFilter>.

Fügen Sie als Nächstes den <elmah> Abschnitt zu hinzu Web.config. Dieser Abschnitt sollte auf derselben Ebene wie das <system.web> -Element angezeigt werden. Fügen Sie im <elmah> Abschnitt die <security> Abschnitte und <errorLog> wie folgt hinzu:

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

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

  ...
</configuration>

Das <security> -Attribut des Abschnitts allowRemoteAccess gibt an, ob der Remotezugriff zulässig ist. Wenn dieser Wert auf 0 festgelegt ist, kann die Fehlerprotokollwebseite nur lokal angezeigt werden. Wenn dieses Attribut auf 1 festgelegt ist, wird die Fehlerprotokollwebseite sowohl für Remote- als auch für lokale Besucher aktiviert. Vorerst deaktivieren wir die Fehlerprotokollwebseite für Remotebesucher. Wir erlauben den Remotezugriff später, nachdem wir die Möglichkeit haben, die Sicherheitsbedenken zu besprechen.

Der <errorLog> Abschnitt definiert die Fehlerprotokollquelle, die vorgibt, wo die Fehlerdetails aufgezeichnet werden. Er ähnelt dem <providers> Abschnitt im System für die Integritätsüberwachung. Die obige Syntax gibt die SqlErrorLog -Klasse als Fehlerprotokollquelle an, die die Fehler in einer Durch den connectionStringName Attributwert angegebenen Microsoft SQL Server-Datenbank protokolliert.

Hinweis

ELMAH wird mit zusätzlichen Fehlerprotokollanbietern ausgeliefert, die zum Protokollieren von Fehlern in einer XML-Datei, einer Microsoft Access-Datenbank, einer Oracle-Datenbank und anderen Datenspeichern verwendet werden können. Informationen zur Verwendung dieser alternativen Fehlerprotokollanbieter finden Sie in der Beispieldatei Web.config , die im ELMAH-Download enthalten ist.

Schritt 4: Erstellen der Fehlerprotokollquellinfrastruktur

Der ELMAH-Anbieter SqlErrorLog protokolliert Fehlerdetails in einer angegebenen Microsoft SQL Server-Datenbank. Der SqlErrorLog Anbieter erwartet, dass diese Datenbank über eine Tabelle mit dem Namen ELMAH_Error und drei gespeicherte Prozeduren verfügt: ELMAH_GetErrorsXml, ELMAH_GetErrorXmlund ELMAH_LogError. Der ELMAH-Download enthält eine Datei namens SQLServer.sql in dem Ordner, der db die T-SQL-Datei zum Erstellen dieser Tabelle und dieser gespeicherten Prozeduren enthält. Sie müssen diese Anweisungen für Ihre Datenbank ausführen, um den SqlErrorLog Anbieter zu verwenden.

Abbildungen 1 und 2 zeigen die Datenbank-Explorer in Visual Studio, nachdem die vom SqlErrorLog Anbieter benötigten Datenbankobjekte hinzugefügt wurden.

Screenshot: S Q L-Fehlerprotokollanbieter protokolliert Fehler, die in die Tabelle geschrieben wurden.

Abbildung 1: Der SqlErrorLog Anbieter protokolliert Fehler in der ELMAH_Error Tabelle

Screenshot, der zeigt, wie der S Q L-Fehlerprotokollanbieter drei gespeicherte Prozeduren verwendet.

Abbildung 2: Der SqlErrorLog Anbieter verwendet drei gespeicherte Prozeduren

ELMAH in Aktion

An diesem Punkt haben wir ELMAH der Webanwendung hinzugefügt, das ErrorLogModule HTTP-Modul und den HTTP-Handler registriert, die ErrorLogPageFactory Konfigurationsoptionen von ELMAH in Web.configangegeben und die erforderlichen Datenbankobjekte für den SqlErrorLog Fehlerprotokollanbieter hinzugefügt. Wir sind jetzt bereit, ELMAH in Aktion zu sehen! Besuchen Sie die Website Buchbewertungen, und besuchen Sie eine Seite, die einen Laufzeitfehler generiert, z Genre.aspx?ID=foo. B. , oder eine nicht vorhandene Seite, z NoSuchPage.aspx. B. . Was beim Besuch dieser Seiten angezeigt wird, hängt von der <customErrors> Konfiguration ab und davon, ob Sie lokal oder remote besuchen. (Weitere Informationen zu diesem Thema finden Sie im Tutorial Anzeigen einer benutzerdefinierten Fehlerseite.)

ELMAH wirkt sich nicht darauf aus, welche Inhalte dem Benutzer angezeigt werden, wenn eine nicht behandelte Ausnahme auftritt. Es protokolliert nur seine Details. Auf dieses Fehlerprotokoll kann über die Webseite elmah.axd über den Stamm Ihrer Website zugegriffen werden, z http://localhost/BookReviews/elmah.axd. B. . (Diese Datei ist in Ihrem Projekt nicht physisch vorhanden, aber wenn eine Anforderung für elmah.axd die Laufzeit eingeht, wird sie an den ErrorLogPageFactory HTTP-Handler gesendet, der das an den Browser zurückgesendete Markup generiert.)

Hinweis

Sie können die elmah.axd Seite auch verwenden, um ELMAH anzuweisen, einen Testfehler zu generieren. Der Besuch elmah.axd/test (wie in ) bewirkt, http://localhost/BookReviews/elmah.axd/testdass ELMAH eine Ausnahme vom Typ Elmah.TestExceptionauslöst, die die Fehlermeldung enthält: "Dies ist eine Test-Ausnahme, die sicher ignoriert werden kann."

Abbildung 3 zeigt das Fehlerprotokoll beim Besuch elmah.axd aus der Entwicklungsumgebung.

Screenshot, der zeigt, wie das Fehlerprotokoll auf einer Webseite angezeigt wird.

Abbildung 3: Elmah.axd Zeigt das Fehlerprotokoll einer Webseite an
(Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Das Fehlerprotokoll in Abbildung 3 enthält sechs Fehlereinträge. Jeder Eintrag enthält den HTTP-status-Code (404 oder 500 für diese Fehler), den Typ, die Beschreibung, den Namen des angemeldeten Benutzers beim Auftreten des Fehlers sowie das Datum und die Uhrzeit. Wenn Sie auf den Link Details klicken, wird eine Seite angezeigt, die dieselbe Fehlermeldung enthält, die im gelben Bildschirm "Fehlerdetails des Todes" (siehe Abbildung 4) angezeigt wird, zusammen mit den Werten der Servervariablen zum Zeitpunkt des Fehlers (siehe Abbildung 5). Sie können auch den unformatierten XML-Code anzeigen, in dem die Fehlerdetails gespeichert werden, die zusätzliche Informationen wie die Werte im HTTP POST-Header enthält.

Screenshot: Fehlerdetails YSOD

Abbildung 4: Anzeigen des Fehlerdetails-YSOD
(Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Screenshot: Werte der Sammlung von Servervariablen

Abbildung 5: Untersuchen der Werte der Servervariablensammlung zum Zeitpunkt des Fehlers
(Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Die Bereitstellung von ELMAH auf der Produktionswebsite umfasst Folgendes:

  • Kopieren der Elmah.dll Datei in den Ordner in der Bin Produktion,
  • Kopieren der ELMAH-spezifischen Konfigurationseinstellungen in die in der Web.config Produktion verwendete Datei und
  • Hinzufügen der Fehlerprotokollquellinfrastruktur zur Produktionsdatenbank.

In früheren Tutorials haben wir Techniken zum Kopieren von Dateien aus der Entwicklung in die Produktion untersucht. Die einfachste Möglichkeit, die Fehlerprotokollquellinfrastruktur in der Produktionsdatenbank abzurufen, besteht möglicherweise darin, SQL Server Management Studio zu verwenden, um eine Verbindung mit der Produktionsdatenbank herzustellen und dann die SqlServer.sql Skriptdatei auszuführen, wodurch die erforderliche Tabelle und gespeicherte Prozeduren erstellt werden.

Anzeigen der Seite "Fehlerdetails" in der Produktion

Nachdem Sie Ihre Website in der Produktion bereitgestellt haben, besuchen Sie die Produktionswebsite, und generieren Sie eine nicht behandelte Ausnahme. Wie in der Entwicklungsumgebung hat ELMAH keine Auswirkungen auf die Fehlerseite, die angezeigt wird, wenn eine nicht behandelte Ausnahme auftritt. Stattdessen protokolliert sie lediglich den Fehler. Wenn Sie versuchen, die Fehlerprotokollseite (elmah.axd) aus der Produktionsumgebung zu besuchen, werden Sie mit der In Abbildung 6 gezeigten Seite Verboten begrüßt.

Screenshot: Remotebesucher können die Fehlerprotokollwebseite nicht anzeigen.

Abbildung 6: Remotebesucher können die Fehlerprotokollwebseite standardmäßig nicht anzeigen.
(Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Denken Sie daran, dass wir im Abschnitt der ELMAH-Konfiguration <security> das allowRemoteAccess Attribut auf 0 festgelegt haben, sodass Remotebenutzer das Fehlerprotokoll nicht anzeigen können. Es ist wichtig, anonymen Besuchern die Anzeige des Fehlerprotokolls zu verbieten, da die Fehlerdetails Sicherheitsrisiken oder andere vertrauliche Informationen aufdecken können. Wenn Sie dieses Attribut auf 1 festlegen und den Remotezugriff auf das Fehlerprotokoll aktivieren, ist es wichtig, den elmah.axd Pfad zu sperren, damit nur autorisierte Besucher darauf zugreifen können. Dies kann erreicht werden, indem Sie der Web.config Datei ein <location> Element hinzufügen.

Die folgende Konfiguration ermöglicht nur Benutzern in der Admin Rolle den Zugriff auf die Fehlerprotokollwebseite:

<?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>

Hinweis

Die Admin Rolle und die drei Benutzer im System - Scott, Jisun und Alice - wurden im Tutorial Konfigurieren einer Website, die Application Services verwendet, hinzugefügt. Die Benutzer Scott und Jisun sind Mitglieder der Admin Rolle. Weitere Informationen zur Authentifizierung und Autorisierung finden Sie in meinen Tutorials zur Websitesicherheit.

Das Fehlerprotokoll in der Produktionsumgebung kann jetzt von Remotebenutzern angezeigt werden. Screenshots der Fehlerprotokollwebseite finden Sie zurück zu den Abbildungen 3, 4 und 5 . Wenn jedoch ein anonymer oder nicht Admin Benutzer versucht, die Fehlerprotokollseite anzuzeigen, wird er automatisch zur Anmeldeseite () weitergeleitet,Login.aspx wie Abbildung 7 zeigt.

Screenshot, der zeigt, wie nicht autorisierte Benutzer automatisch zur Anmeldeseite weitergeleitet werden.

Abbildung 7: Nicht autorisierte Benutzer werden automatisch zur Anmeldeseite umgeleitet
(Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Fehler bei der programmgesteuerten Protokollierung

Das HTTP-Modul von ErrorLogModule ELMAH protokolliert nicht behandelte Ausnahmen automatisch für die angegebene Protokollquelle. Alternativ können Sie einen Fehler protokollieren, ohne eine nicht behandelte Ausnahme auslösen zu müssen, indem Sie die -Klasse und ihre ErrorSignalRaise -Methode verwenden. Die Raise -Methode wird ein Exception -Objekt übergeben und protokolliert es so, als wäre diese Ausnahme ausgelöst worden und hätte die ASP.NET Runtime erreicht, ohne behandelt zu werden. Der Unterschied besteht jedoch darin, dass die Anforderung nach dem Aufruf der Raise Methode normal weiter ausgeführt wird, während eine ausgelöste, nicht behandelte Ausnahme die normale Ausführung der Anforderung unterbricht und bewirkt, dass die ASP.NET Runtime die konfigurierte Fehlerseite anzeigt.

Die ErrorSignal -Klasse ist nützlich in Situationen, in denen es eine Aktion gibt, die möglicherweise fehlschlägt, aber ihr Fehler ist nicht katastrophal für den insgesamt ausgeführten Vorgang. Für instance kann eine Website ein Formular enthalten, das die Eingaben des Benutzers übernimmt, sie in einer Datenbank speichert und dem Benutzer dann eine E-Mail sendet, in der er darüber informiert wird, dass die Informationen verarbeitet wurden. Was sollte passieren, wenn die Informationen erfolgreich in der Datenbank gespeichert werden, aber beim Senden der E-Mail-Nachricht ein Fehler auftritt? Eine Möglichkeit wäre, eine Ausnahme auszulösen und den Benutzer zur Fehlerseite zu senden. Dies kann jedoch den Benutzer zu der Annahme verwirren, dass die eingegebenen Informationen nicht gespeichert wurden. Ein anderer Ansatz wäre, den E-Mail-bezogenen Fehler zu protokollieren, aber die Benutzerfreundlichkeit in keiner Weise zu ändern. Hier ist die ErrorSignal -Klasse nützlich.

// ... Save user's information to the database ...
...

// Attempt to send the user a confirmation email
try
{
    // ... Send an email ...
}
catch (Exception e)
{
    // Error in sending email. Log it!
    ErrorSignal.FromCurrentContext().Raise(e);
}

Fehlerbenachrichtigung über Email

Neben der Protokollierung von Fehlern in einer Datenbank kann ELMAH auch so konfiguriert werden, dass Fehlerdetails an einen angegebenen Empfänger gesendet werden. Diese Funktionalität wird vom ErrorMailModule HTTP-Modul bereitgestellt. Daher müssen Sie dieses HTTP-Modul Web.config registrieren, um Fehlerdetails per E-Mail senden zu können.

<?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>

Geben Sie als Nächstes Informationen zur Fehler-E-Mail im <elmah> Abschnitt des <errorMail> Elements an, wobei der Absender und Empfänger der E-Mail, der Betreff und der asynchrone Versand der E-Mail angegeben werden.

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

  <elmah>
  ...

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

  ...
</configuration>

Mit den oben genannten Einstellungen sendet ELMAH eine E-Mail mit den Fehlerdetails, wenn support@example.com ein Laufzeitfehler auftritt. Die Fehler-E-Mail von ELMAH enthält dieselben Informationen, die auf der Webseite mit den Fehlerdetails angezeigt werden, nämlich die Fehlermeldung, die Stapelverfolgung und die Servervariablen (siehe Abbildungen 4 und 5). Die Fehler-E-Mail enthält auch den gelben Bildschirm der Ausnahmedetails des Todesinhalts als Anlage (YSOD.html).

Abbildung 8 zeigt die Fehler-E-Mail von ELMAH, die durch den Besuch Genre.aspx?ID=foogeneriert wurde. Während Abbildung 8 nur die Fehlermeldung und die Stapelverfolgung zeigt, sind die Servervariablen weiter unten im Text der E-Mail enthalten.

Screenshot, der zeigt, dass Sie ELMAH so konfigurieren können, dass Fehlerdetails per E-Mail gesendet werden.

Abbildung 8: Sie können ELMAH so konfigurieren, dass Fehlerdetails über Email
(Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Nur interessante Protokollierungsfehler

Standardmäßig protokolliert ELMAH die Details jeder nicht behandelten Ausnahme, einschließlich 404 und anderer HTTP-Fehler. Sie können ELMAH anweisen, diese oder andere Fehlertypen mithilfe der Fehlerfilterung zu ignorieren. Die Filterlogik wird vom HTTP-Modul von ErrorFilterModule ELMAH ausgeführt, das Sie registrieren Web.config müssen, um die Filterlogik verwenden zu können. Die Regeln für die Filterung werden im <errorFilter> Abschnitt angegeben.

Das folgende Markup weist ELMAH an, 404-Fehler nicht zu protokollieren.

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

  <elmah>
  ...

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

  ...
</configuration>

Hinweis

Vergessen Sie nicht, dass Sie das HTTP-Modul registrieren müssen, um die ErrorFilterModule Fehlerfilterung verwenden zu können.

Das <equal> Element innerhalb des <test> Abschnitts wird als Assertion bezeichnet. Wenn die Assertion als true ausgewertet wird, wird der Fehler aus dem ELMAH-Protokoll gefiltert. Es sind weitere Assertionen verfügbar, z. B. <greater>, <greater-or-equal><not-equal>, , <lesser>, <lesser-or-equal>usw. Sie können Assertionen auch mithilfe der <and> booleschen Operatoren und <or> kombinieren. Darüber hinaus können Sie sogar einen einfachen JavaScript-Ausdruck als Assertion einschließen oder eigene Assertionen in C# oder Visual Basic schreiben.

Weitere Informationen zu den Fehlerfilterfunktionen von ELMAH finden Sie im Abschnitt Fehlerfilterung in den ELMAH-Artikeln.

Zusammenfassung

ELMAH bietet einen einfachen, aber leistungsstarken Mechanismus zum Protokollieren von Fehlern in einer ASP.NET Webanwendung. Wie das Integritätsüberwachungssystem von Microsoft kann ELMAH Fehler in einer Datenbank protokollieren und die Fehlerdetails per E-Mail an einen Entwickler senden. Im Gegensatz zum System zur Integritätsüberwachung bietet ELMAH standardmäßige Unterstützung für eine größere Palette von Fehlerprotokolldatenspeichern, einschließlich: Microsoft SQL Server, Microsoft Access, Oracle, XML-Dateien und einige andere. Darüber hinaus bietet ELMAH einen integrierten Mechanismus zum Anzeigen des Fehlerprotokolls und Details zu einem bestimmten Fehler von einer Webseite, elmah.axd. Die elmah.axd Seite kann Auch Fehlerinformationen als RSS-Feed oder als durch Trennzeichen getrennte Wertedatei (CSV) rendern, die Sie mit Microsoft Excel lesen können. Sie können ELMAH auch anweisen, Fehler mithilfe deklarativer oder programmgesteuerter Assertionen aus dem Protokoll zu filtern. Und ELMAH kann mit ASP.NET Version 1.x-Anwendungen verwendet werden.

Jede bereitgestellte Anwendung sollte über einen Mechanismus zum automatischen Protokollieren nicht behandelter Ausnahmen und zum Senden von Benachrichtigungen an das Entwicklungsteam verfügen. Ob dies mithilfe der Integritätsüberwachung erreicht wird oder ELMAH sekundär ist. Mit anderen Worten, es spielt keine große Rolle, ob Sie die Integritätsüberwachung oder ELMAH verwenden; beide Systeme auszuwerten und dann das System auszuwählen, das Ihren Anforderungen am besten entspricht. Entscheidend ist, dass ein Mechanismus eingerichtet wird, um nicht behandelte Ausnahmen in der Produktionsumgebung zu protokollieren.

Viel Spaß beim Programmieren!

Weitere Informationen

Weitere Informationen zu den in diesem Tutorial behandelten Themen finden Sie in den folgenden Ressourcen: