Freigeben über


Protokollieren von Fehlerdetails mit ELMAH (VB)

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 wird das Herunterladen und Konfigurieren von ELMAH beschrieben.

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 die Details nicht behandelter Ausnahmen zu protokollieren und per E-Mail zu senden. Es gibt jedoch einige Probleme mit diesem System. In erster Linie ist der Mangel an 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 durchsuchen, Ihren E-Mail-Posteingang durchsuchen oder eine Webseite erstellen, auf der Informationen aus der aspnet_WebEvent_Events Tabelle angezeigt werden.

Ein weiterer Schmerzpunkt 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, wie und wann Ereignisse protokolliert werden, kann die ordnungsgemäße Konfiguration des Integritätsüberwachungssystems eine lästige Aufgabe sein. Schließlich gibt es Kompatibilitätsprobleme. Da die Integritätsüberwachung zuerst dem .NET Framework in Version 2.0 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 verwendet haben, um Fehlerdetails in einer Datenbank zu protokollieren, 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 bemerkenswerteste 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 beschrieben, die beim Hinzufügen von ELMAH zu einer ASP.NET-Anwendung erforderlich sind. Jetzt geht‘s los!

Hinweis

Das Integritätsüberwachungssystem und ELMAH haben beide ihre eigenen Vor- und Nachteile. Ich ermutige Sie, beide Systeme auszuprobieren und zu entscheiden, welche am besten Ihren Anforderungen entspricht.

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, 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.

Wir gehen jeden dieser vier Schritte nacheinander durch.

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 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 mit der rechten Maustaste auf den Websitenamen im Projektmappen-Explorer klicken und im Kontextmenü Verweis hinzufügen auswählen. Dadurch wird das Dialogfeld Verweis hinzufügen geöffnet. Navigieren Sie zur Registerkarte Durchsuchen, und wählen Sie die Elmah.dll Datei aus. Mit dieser 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 vom ELMAH-System verwendeten Klassen. 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, wobei die drei am häufigsten verfügbaren http-Module sind:

    • 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 Kommas getrennte Datei (CSV) rendern.

  • Fehlerprotokollquellen: Eine vordefinierte ELMAH kann 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 Integritätsüberwachungssystem wurde auch die ELMAH-Architektur mithilfe des Anbietermodells erstellt, was bedeutet, dass Sie bei Bedarf eigene benutzerdefinierte Protokollquellenanbieter erstellen und nahtlos integrieren können.

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

Während die Elmah.dll Datei die HTTP-Module und den Handler enthält, die zum automatischen Protokollieren nicht behandelter 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 nach der Registrierung das HttpApplicationEreignis des Ereignisses Error . Wenn dieses Ereignis ausgelöst wird, werden die ErrorLogModule Details der Ausnahme für eine angegebene 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 verantwortlich, wenn das Fehlerprotokoll von einer Webseite angezeigt wird.

Die spezifische Syntax für die Registrierung von HTTP-Modulen und -Handlern hängt vom Webserver ab, der die Website mit Strom versorgt. Für die 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 sie 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 die gleiche Konfiguration unabhängig vom verwendeten Webserver in den Entwicklungs- und Produktionsumgebungen verwendet werden kann.

Beginnen Sie mit der Registrierung des ErrorLogModule HTTP-Moduls und des ErrorLogPageFactory HTTP-Handlers <httpModules> im 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 mit dem Namen elmah.axd eingeht. Weiter unten in diesem Tutorial wird der ErrorLogPageFactory HTTP-Handler in Aktion angezeigt.

Schritt 3: Konfigurieren von ELMAH

ELMAH sucht nach seinen Konfigurationsoptionen in der Datei der Website Web.config in einem benutzerdefinierten Konfigurationsabschnitt namens <elmah>. 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 <configSections>das folgende 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 seine Unterabschnitte: <security>, <errorLog>, <errorMail>und <errorFilter>.

Fügen Sie als Nächstes den <elmah> Abschnitt 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 gelegenheit haben, die Sicherheitsbedenken zu besprechen.

Der <errorLog> Abschnitt definiert die Fehlerprotokollquelle, die vorgibt, wo die Fehlerdetails aufgezeichnet werden. Er ähnelt dem <providers> Abschnitt im Integritätsüberwachungssystem. 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 der ELMAH-Fehlertabelle mit den Protokollfehlern des S Q L-Fehleranbieters

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: Fehlerprotokoll einer Webseite

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, der zeigt, dass Sie die Fehlerdetails Y S O D anzeigen können.

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

Screenshot: Untersuchen der Werte der Servervariablensammlung zum Zeitpunkt des Fehlers

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: Standardmäßig können Remotebesucher 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, dass 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
    ' ... Send an email ...
Try
Catch e As Exception
' Error in sending email. Log it!
ErrorSignal.FromCurrentContext().Raise(e)
End Try

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: Konfigurieren von ELMAH zum Senden von Fehlerdetails per E-Mail

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, einschließlich: <greater>, <greater-or-equal>, <not-equal>, <lesser>, , <lesser-or-equal>usw. Sie können Assertionen auch mit den <and> booleschen Operatoren und <or> kombinieren. Darüber hinaus können Sie sogar einen einfachen JavaScript-Ausdruck als Assertion einschließen oder Ihre eigenen Assertionen in C# oder Visual Basic schreiben.

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

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 sofort einsatzbereite Unterstützung für einen größeren Bereich von Fehlerprotokolldatenspeichern, einschließlich: 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 auf einer Webseite, elmah.axd. Die elmah.axd Seite kann Fehlerinformationen auch 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 Anwendungen der Version 1.x 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 oder ELMAH erreicht wird, ist sekundär. Mit anderen Worten, es spielt keine große Rolle, ob Sie die Integritätsüberwachung oder ELMAH verwenden. Bewerten Sie beide Systeme, und wählen Sie dann das System aus, das Ihren Anforderungen am besten entspricht. Von grundlegender Bedeutung 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 erläuterten Themen finden Sie in den folgenden Ressourcen: