Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
von Scott Mitchell
Fehlerprotokollierungsmodule und -Handler (ELMAH) bieten einen weiteren Ansatz zur Protokollierung von Laufzeitfehlern in einer Produktionsumgebung. ELMAH ist eine kostenlose Open Source-Fehlerprotokollierungsbibliothek, die Features wie Fehlerfilterung und die Möglichkeit zum Anzeigen des Fehlerprotokolls von einer Webseite, als RSS-Feed oder zum Herunterladen als durch Trennzeichen getrennte Datei enthält. Dieses Lernprogramm führt Sie durch das Herunterladen und Konfigurieren von ELMAH.
Einführung
Im vorherigen Lehrprogramm wurde das ASP.NET-Integritätsüberwachungssystem untersucht, das eine einsatzbereite Bibliothek zum Aufzeichnen einer Vielzahl von Webereignissen bietet. Viele Entwickler verwenden die Gesundheitsüberwachung zum Protokollieren und E-Mail senden von Details zu unbehandelten Ausnahmen. Es gibt jedoch einige Schmerzpunkte mit diesem System. In erster Linie fehlt jede Art von Benutzeroberfläche zum Anzeigen von Informationen über die protokollierten Ereignisse. Wenn Sie eine Zusammenfassung der letzten 10 Fehler anzeigen oder die Details eines Fehlers anzeigen möchten, der letzte Woche aufgetreten ist, müssen Sie entweder die Datenbank durchlaufen, ihren E-Mail-Posteingang durchsuchen oder eine Webseite erstellen, auf der Informationen aus der aspnet_WebEvent_Events Tabelle angezeigt werden.
Ein weiteres Problem liegt in der Komplexität der Gesundheitsüberwachung. Da die Gesundheitsüberwachung verwendet werden kann, um eine Vielzahl verschiedener Ereignisse aufzuzeichnen, und es eine Vielzahl von Optionen dafür gibt, wie und wann Ereignisse protokolliert werden, kann die ordnungsgemäße Konfiguration des Gesundheitsüberwachungssystems eine mühsame Aufgabe sein. Schließlich gibt es Kompatibilitätsprobleme. Da die Gesundheitsüberwachung dem .NET Framework erst in Version 2.0 hinzugefügt wurde, steht sie für ältere Webanwendungen, die mit ASP.NET Version 1.x erstellt wurden, nicht zur Verfügung. Darüber hinaus funktioniert die SqlWebEventProvider Klasse, die wir im vorherigen Lernprogramm 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. einer XML-Datei oder Oracle-Datenbank.
Eine Alternative zum System zur Integritätsüberwachung sind Fehlerprotokollierungsmodule und -Handler (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 umfasst ELMAH Unterstützung für ASP.NET 1.x, ASP.NET 2.0 und ASP.NET 3.5-Anwendungen und wird mit einer Vielzahl von Protokollquellenanbietern ausgeliefert.
In diesem Lernprogramm werden die Schritte zum Hinzufügen von ELMAH zu einer ASP.NET Anwendung erläutert. Fangen wir an!
Hinweis
Das Gesundheitsüberwachungssystem und ELMAH haben jeweils ihre eigenen Vor- und Nachteile. Ich ermuntere Sie, beide Systeme auszuprobieren und zu entscheiden, was für Sie am besten geeignet ist.
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 einfacher Prozess, der weniger als fünf Minuten dauert. Kurz gesagt, es umfasst vier einfache Schritte:
- Laden Sie ELMAH herunter und fügen Sie die
Elmah.dllAssembly Ihrer Webanwendung hinzu. - Registrieren sie die HTTP-Module und den Handler von ELMAH in
Web.config, - Angeben der Konfigurationsoptionen von ELMAH und
- Erstellen Sie bei Bedarf die Fehlerprotokollquellinfrastruktur.
Sehen wir uns jeden dieser vier Schritte einzeln an.
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 Lernprogramm 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 "Download" Bin , der Unterordner für verschiedene .NET Framework-Versionen und für Release- und Debugbuilds enthält. Verwenden Sie den Releasebuild für die entsprechende Frameworkversion. Wenn Sie beispielsweise 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 zu 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. Diese Aktion fügt die Elmah.dll Datei dem Ordner der Webanwendung Bin hinzu.
Hinweis
Der Typ "Webanwendungsprojekt" (WAP) zeigt den Bin Ordner nicht im Projektmappen-Explorer an. Stattdessen werden diese Elemente unter dem Ordner "Verweise" aufgelistet.
Die Elmah.dll Assembly enthält die klassen, die vom ELMAH-System verwendet werden. Diese Klassen sind in eine von drei Kategorien unterteilt:
HTTP-Module – ein HTTP-Modul ist eine Klasse, die Ereignishandler für
HttpApplicationEreignisse definiert, z. B. dasErrorEreignis. ELMAH umfasst mehrere HTTP-Module, die drei deutschsten sind:-
ErrorLogModule– protokolliert unbehandelte Ausnahmen für eine Protokollquelle. -
ErrorMailModule– sendet die Details einer unbehandelten Ausnahme in einer E-Mail-Nachricht. -
ErrorFilterModule– Wendet vom Entwickler angegebene Filter an, um zu bestimmen, welche Ausnahmen protokolliert werden 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, in einer Microsoft Access-Datenbank, in einer Oracle-Datenbank, in einer XML-Datei, in einer SQLite-Datenbank oder in einer Vista DB-Datenbank protokollieren. Wie das Gesundheitsüberwachungssystem wurde die Architektur von ELMAH mit dem Anbietermodell erstellt. Das bedeutet, dass Sie bei Bedarf eigene benutzerdefinierte Protokollquellanbieter erstellen und nahtlos integrieren können.
Schritt 2: Registrieren des HTTP-Moduls und Handlers von ELMAH
Während die Elmah.dll Datei die HTTP-Module und den Handler enthält, die zum automatischen Protokollieren unbehandelter Ausnahmen und zum Anzeigen von Fehlerdetails von einer Webseite erforderlich sind, müssen diese explizit in der Konfiguration der Webanwendung registriert werden. Das ErrorLogModule HTTP-Modul abonniert, sobald es registriert ist, das Ereignis von HttpApplicationError. Wenn dieses Ereignis ausgelöst wird, protokolliert ErrorLogModule die Details der Ausnahme an eine angegebene Protokollquelle. Wir erfahren, wie Sie den Protokollquellanbieter im nächsten Abschnitt "Konfigurieren von ELMAH" definieren. Die ErrorLogPageFactory HTTP-Handlerfactory ist für das Generieren des Markups beim Anzeigen des Fehlerprotokolls von einer Webseite verantwortlich.
Die spezifische Syntax für die Registrierung von HTTP-Modulen und -Handlern hängt vom Webserver ab, der die Website einschaltet. Für den ASP.NET Development Server und die Microsoft IIS-Version 6.0 und frühere Versionen werden HTTP-Module und -Handler in den <httpModules> und <httpHandlers> Abschnitten registriert, die innerhalb des <system.web> Elements angezeigt werden. Wenn Sie IIS 7.0 verwenden, müssen sie im <system.webServer>-Element sowie in den Abschnitten <modules> und <handlers> 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 Option, da die gleiche Konfiguration in den Entwicklungs- und Produktionsumgebungen verwendet werden kann, unabhängig vom verwendeten Webserver.
Beginnen Sie, indem Sie das ErrorLogModule HTTP-Modul und den ErrorLogPageFactory HTTP-Handler im Abschnitt <httpModules> und <httpHandlers> in <system.web> registrieren. 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 das HTTP-Modul und den Handler von ELMAH als Nächstes im <system.webServer> Element. Wie zuvor, wenn dieses Element noch nicht in Ihrer Konfiguration vorhanden ist, fügen Sie es 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 für die Registrierung des ErrorLogPageFactory HTTP-Handlers ein path-Attribut enthält, das auf elmah.axd gesetzt ist. Dieses Attribut informiert die Webanwendung, dass, wenn eine Anforderung für eine Seite mit dem Namen elmah.axd eingeht, die Anforderung vom ErrorLogPageFactory HTTP-Handler verarbeitet werden soll. Später in diesem Lernprogramm wird der ErrorLogPageFactory HTTP-Handler in Aktion angezeigt.
Schritt 3: Konfigurieren von ELMAH
ELMAH sucht nach den Konfigurationsoptionen in der Datei der Website Web.config in einem benutzerdefinierten Konfigurationsabschnitt namens <elmah>. Um einen benutzerdefinierten Abschnitt in Web.config verwenden zu können, muss er zuerst im <configSections> Element definiert werden. Öffnen Sie die Web.config Datei, und fügen Sie dem <configSections>Folgenden Markup hinzu:
<?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 die zugehörigen Unterabschnitte: <security>, , <errorLog>, <errorMail>und <errorFilter>.
Fügen Sie als Nächstes den <elmah> Abschnitt zu Web.config hinzu. Dieser Abschnitt sollte auf derselben Ebene wie das <system.web> Element angezeigt werden. Fügen Sie im <elmah>-Abschnitt die <security>- und <errorLog>-Abschnitte 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, ist die Fehlerprotokollwebseite sowohl für Remote- als auch für lokale Besucher aktiviert. Jetzt deaktivieren wir die Fehlerprotokollwebseite für Remotebesucher. Wir ermöglichen später den Remotezugriff, nachdem wir die Möglichkeit haben, die Sicherheitsbedenken zu besprechen.
Der <errorLog> Abschnitt definiert die Fehlerprotokollquelle, die angibt, wo die Fehlerdetails aufgezeichnet werden. Sie ähnelt dem <providers> Abschnitt im Integritätsüberwachungssystem. Die obige Syntax gibt die SqlErrorLog Klasse als Fehlerprotokollquelle an, die die Fehler in einer microsoft SQL Server-Datenbank protokolliert, die durch den connectionStringName Attributwert angegeben wird.
Hinweis
ELMAH enthält zusätzliche Fehlerprotokollanbieter, 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 Anbieter von SqlErrorLog ELMAH protokolliert Fehlerdetails in einer angegebenen Microsoft SQL Server-Datenbank. Der SqlErrorLog Anbieter erwartet, dass diese Datenbank eine Tabelle mit dem Namen ELMAH_Error und drei gespeicherten Prozeduren hat: ELMAH_GetErrorsXml, , ELMAH_GetErrorXmlund ELMAH_LogError. Der ELMAH-Download enthält im db Ordner eine Datei namens SQLServer.sql, die T-SQL zum Erstellen dieser Tabelle und dieser gespeicherte Prozeduren enthält. Sie müssen diese Anweisungen in Ihrer Datenbank ausführen, um den SqlErrorLog Anbieter zu verwenden.
Abbildung 1 und 2 zeigen den Datenbank-Explorer in Visual Studio, nachdem die vom SqlErrorLog Anbieter benötigten Datenbankobjekte hinzugefügt wurden.
Abbildung 1: Der SqlErrorLog Anbieter protokolliert Fehler in der ELMAH_Error Tabelle.
Abbildung 2: Der SqlErrorLog Anbieter verwendet drei gespeicherte Prozeduren
ELMAH in Aktion
An diesem Punkt haben wir ELMAH zur Webanwendung hinzugefügt, das ErrorLogModule HTTP-Modul und den ErrorLogPageFactory HTTP-Handler registriert, die Konfigurationsoptionen Web.configvon ELMAH angegeben und die erforderlichen Datenbankobjekte für den SqlErrorLog Fehlerprotokollanbieter hinzugefügt. Wir sind jetzt bereit, ELMAH in Aktion zu sehen! Besuchen Sie die Website "Book Reviews" und rufen Sie eine Seite auf, die einen Laufzeitfehler generiert, wie Genre.aspx?ID=foo, oder eine nicht existierende Seite, wie NoSuchPage.aspx. Was Sie beim Besuch dieser Seiten sehen, hängt von der <customErrors> Konfiguration ab und davon, ob Sie lokal oder remote besuchen. (Weitere Informationen finden Sie im Tutorial zur Anzeige einer benutzerdefinierten Fehlerseite zur Auffrischung dieses Themas.)
ELMAH wirkt sich nicht darauf aus, welche Inhalte dem Benutzer angezeigt werden, wenn eine unbehandelte Ausnahme auftritt; es protokolliert lediglich seine Details. Auf dieses Fehlerprotokoll kann über die Webseite elmah.axd vom Stamm Ihrer Website aus zugegriffen werden, z. B. über http://localhost/BookReviews/elmah.axd. (Diese Datei ist in Ihrem Projekt nicht physisch vorhanden, aber wenn eine Anforderung für elmah.axd die Laufzeit eingeht, sendet sie an den ErrorLogPageFactory HTTP-Handler, 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 von elmah.axd/test (wie bei http://localhost/BookReviews/elmah.axd/test) bewirkt, dass ELMAH eine Ausnahme vom Typ Elmah.TestException auslöst, die die Fehlermeldung enthält: "Dies ist eine Testausnahme, die sicher ignoriert werden kann."
Abbildung 3 zeigt das Fehlerprotokoll beim Zugriff auf elmah.axd aus der Entwicklungsumgebung.
Abbildung 3: Elmah.axd Zeigt das Fehlerprotokoll von 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-Statuscode (404 oder 500, für diese Fehler), den Typ, die Beschreibung, den Namen des angemeldeten Benutzers, wenn der Fehler aufgetreten ist, und das Datum und die Uhrzeit. Wenn Sie auf den Link "Details" klicken, wird eine Seite mit der gleichen Fehlermeldung angezeigt, die im Gelben Bildschirm "Fehlerdetails" (siehe Abbildung 4) zusammen mit den Werten der Servervariablen zum Zeitpunkt des Fehlers angezeigt wird (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 enthalten.
Abbildung 4: Anzeigen der Fehlerdetails YSOD
(Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Abbildung 5: Untersuchen der Werte der Servervariablen-Auflistung 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.dllDatei in denBinOrdner auf der Produktionsumgebung, - Kopieren der ELMAH-spezifischen Konfigurationseinstellungen in die in der
Web.configProduktion verwendete Datei und - Hinzufügen der Fehlerprotokollquellinfrastruktur zur Produktionsdatenbank.
Wir haben Techniken zum Kopieren von Dateien aus der Entwicklung in die Produktion in früheren Lernprogrammen untersucht. Die einfachste Möglichkeit zum Abrufen der Fehlerprotokollquellinfrastruktur in der Produktionsdatenbank besteht darin, SQL Server Management Studio zum Herstellen einer Verbindung mit der Produktionsdatenbank zu verwenden und dann die SqlServer.sql Skriptdatei auszuführen, die die erforderliche Tabelle und gespeicherte Prozeduren erstellt.
Anzeigen der Seite "Fehlerdetails" in der Produktionsumgebung
Nachdem Sie Ihre Website zur Produktion bereitgestellt haben, besuchen Sie die Produktionswebsite und generieren Sie eine unbehandelte Ausnahme. Wie in der Entwicklungsumgebung hat ELMAH keine Auswirkungen auf die Fehlerseite, die angezeigt wird, wenn eine unbehandelte 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 dargestellten Seite "Verboten" begrüßt.
Abbildung 6: Standardmäßig können Remotebesucher die Fehlerprotokollwebseite nicht anzeigen.
(Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Erinnern Sie sich daran, dass wir im Abschnitt der ELMAH-Konfiguration <security> das allowRemoteAccess Attribut auf 0 festlegen, wodurch remotebenutzer daran gehindert werden, das Fehlerprotokoll anzuzeigen. Es ist wichtig, anonyme Besucher daran zu hindern, das Fehlerprotokoll anzuzeigen, da die Fehlerdetails Möglicherweise Sicherheitsrisiken oder andere vertrauliche Informationen offenlegen. 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 durch Hinzufügen eines <location> Elements zur Web.config Datei erreicht werden.
Mit der folgenden Konfiguration können nur Benutzer in der Administratorrolle auf die Fehlerprotokollwebseite zugreifen:
<?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 Administratorrolle und die drei Benutzer im System – Scott, Jisun und Alice – wurden im Lernprogramm "Konfigurieren einer Website, die Anwendungsdienste verwendet" hinzugefügt. Benutzer Scott und Jisun sind Mitglieder der Administratorrolle. Weitere Informationen zur Authentifizierung und Autorisierung finden Sie in meinen Lernprogrammen zur Websitesicherheit.
Das Fehlerprotokoll in der Produktionsumgebung kann jetzt von Remotebenutzern angezeigt werden. Verweisen Sie auf Abbildungen 3, 4 und 5 für Screenshots der Webseite des Fehlerprotokolls. Wenn ein anonymer oder Nicht-Administrator-Benutzer jedoch versucht, die Fehlerprotokollseite anzuzeigen, wird er automatisch an die Anmeldeseite umgeleitet (Login.aspx), wie in Abbildung 7 dargestellt.
Abbildung 7: Nicht autorisierte Benutzer werden automatisch auf die Anmeldeseite umgeleitet.
(Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Programmgesteuerte Protokollierung von Fehlern
Das HTTP-Modul von ErrorLogModule ELMAH protokolliert automatisch unbehandelte Ausnahmen für die angegebene Protokollquelle. Alternativ können Sie einen Fehler protokollieren, ohne eine unbehandelte Ausnahme mithilfe der ErrorSignal Klasse und der zugehörigen Raise Methode auslösen zu müssen. Die Methode Raise erhält ein Exception Objekt und protokolliert es so, als wäre diese Ausnahme ausgelöst worden und hätte die ASP.NET-Laufzeit erreicht, ohne behandelt zu werden. Der Unterschied besteht jedoch darin, dass die Anforderung nach dem Aufrufen der Raise Methode normal ausgeführt wird, während eine ausgelöste, unbehandelte Ausnahme die normale Ausführung der Anforderung unterbricht und bewirkt, dass die ASP.NET Laufzeit die konfigurierte Fehlerseite anzeigt.
Die ErrorSignal Klasse ist in Situationen nützlich, in denen es eine Aktion gibt, die fehlschlägt, aber ihr Fehler ist nicht katastrophal für den gesamtbetrieblich ausgeführten Vorgang. Eine Website kann z. B. ein Formular enthalten, das die Eingabe des Benutzers annimmt, sie in einer Datenbank speichert und dem Benutzer dann eine E-Mail sendet, die sie darüber informiert, dass diese 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 Option wäre das Auslösen einer Ausnahme und das Senden des Benutzers an die Fehlerseite. Dies kann jedoch dazu führen, dass der Benutzer denkt, dass die eingegebenen Informationen nicht gespeichert wurden. Ein anderer Ansatz wäre das Protokollieren des E-Mail-bezogenen Fehlers, aber keine Änderung der Benutzerfreundlichkeit. 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 per E-Mail
Zusammen mit der Protokollierung von Fehlern in einer Datenbank kann ELMAH auch für E-Mail-Fehlerdetails an einen angegebenen Empfänger konfiguriert werden. Diese Funktionalität wird vom ErrorMailModule HTTP-Modul bereitgestellt. Sie müssen daher dieses HTTP-Modul in Web.config registrieren, um Fehlerdetails per E-Mail zu senden.
<?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, die den Absender und Empfänger der E-Mail, den Betreff und die asynchrone Übermittlung der E-Mail angibt.
<?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 obigen Einstellungen sendet ELMAH, sobald ein Laufzeitfehler auftritt, eine E-Mail mit den Fehlerdetails an support@example.com. Die Fehler-E-Mail von ELMAH enthält die gleichen Informationen, die auf der Webseite mit den Fehlerdetails angezeigt werden, nämlich die Fehlermeldung, die Stapelüberwachung und die Servervariablen (siehe Abbildung 4 und 5). Die Fehler-E-Mail enthält auch den Inhalt "Exception Details Yellow Screen of Death" als Anlage (YSOD.html).
Abbildung 8 zeigt die Fehler-E-Mail von ELMAH, die durch den Besuch Genre.aspx?ID=foogeneriert wurde. In Abbildung 8 sind zwar nur die Fehlermeldung und die Stapelüberwachung dargestellt, die Servervariablen werden jedoch weiter unten im Textkörper der E-Mail eingeschlossen.
Abbildung 8: Sie können ELMAH so konfigurieren, dass Fehlerdetails per E-Mail gesendet werden
(Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Nur Protokollierungsfehler von Interesse
Standardmäßig protokolliert ELMAH die Details jeder unbehandelten Ausnahme, einschließlich 404 und anderer HTTP-Fehler. Sie können ELMAH anweisen, diese oder andere Arten von Fehlern mithilfe der Fehlerfilterung zu ignorieren. Die Filterlogik wird vom HTTP-Modul von ErrorFilterModule ELMAH ausgeführt, das Sie in Web.config registrieren müssen, um die Filterlogik zu verwenden. Die Regeln für die Filterung werden im <errorFilter> Abschnitt angegeben.
Das folgende Markup weist ELMAH an, keine 404 Fehler 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, um die Fehlerfilterung zu verwenden, müssen Sie das ErrorFilterModule HTTP-Modul registrieren.
Das <equal> Element innerhalb des <test> Abschnitts wird als Assertion bezeichnet. Wenn die Assertion als wahr ausgewertet wird, wird der Fehler aus dem ELMAH-Protokoll gefiltert. Es stehen weitere Assertionen zur Verfügung, darunter: <greater>, , <greater-or-equal>, , <not-equal>, <lesser>, <lesser-or-equal>usw. Sie können Assertionen auch mithilfe der <and> booleschen <or> Operatoren 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 System zur Integritätsüberwachung von Microsoft kann ELMAH Fehler in einer Datenbank protokollieren und die Fehlerdetails per E-Mail an einen Entwickler senden. Im Gegensatz zum Gesundheitsüberwachungssystem bietet ELMAH standardmäßig Unterstützung für eine breitere Palette von Fehlerprotokoll-Datenspeichern, darunter: Microsoft SQL Server, Microsoft Access, Oracle, XML-Dateien und mehrere 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 Wertdatei (CSV) rendern, die Sie mit Microsoft Excel lesen können. Sie können ELMAH auch anweisen, Fehler aus dem Protokoll mithilfe von deklarativen oder programmgesteuerten Assertionen zu filtern. Und ELMAH kann mit ASP.NET Version 1.x-Anwendungen verwendet werden.
Jede bereitgestellte Anwendung sollte über einen Mechanismus zum automatischen Protokollieren unbehandelter Ausnahmen und zum Senden von Benachrichtigungen an das Entwicklungsteam verfügen. Ob dies mithilfe der Integritätsüberwachung oder ELMAH erreicht wird, ist sekundär. Mit anderen Worten, es ist nicht wirklich entscheidend, ob Sie die Gesundheitsüberwachung oder ELMAH verwenden; bewerten Sie beide Systeme und wählen Sie dann dasjenige aus, das Ihren Anforderungen am besten entspricht. Grundsätzlich ist es wichtig, dass einige Mechanismen zum Protokollieren unbehandelter Ausnahmen in der Produktionsumgebung eingerichtet werden.
Glückliche Programmierung!
Weiterführende Lektüre
Weitere Informationen zu den in diesem Lernprogramm erläuterten Themen finden Sie in den folgenden Ressourcen: