Protokollieren von Fehlerdetails mit der ASP.NET-Systemüberwachung (VB)
von Scott Mitchell
Das System zur Integritätsüberwachung von Microsoft bietet eine einfache und anpassbare Möglichkeit zum Protokollieren verschiedener Webereignisse, einschließlich unbehandelter Ausnahmen. Dieses Lernprogramm führt Sie durch das Einrichten des Integritätsüberwachungssystems zum Protokollieren unbehandelter Ausnahmen bei einer Datenbank und zum Benachrichtigen von Entwicklern über eine E-Mail-Nachricht.
Einführung
Die Protokollierung ist ein nützliches Tool zum Überwachen der Integrität einer bereitgestellten Anwendung und zur Diagnose von Problemen, die auftreten können. Es ist besonders wichtig, Fehler zu protokollieren, die in einer bereitgestellten Anwendung auftreten, damit sie behoben werden können. Das Error
Ereignis wird ausgelöst, wenn eine unbehandelte Ausnahme in einer ASP.NET Anwendung auftritt. Im vorherigen Lernprogramm wurde gezeigt, wie ein Entwickler über einen Fehler benachrichtigt und seine Details protokolliert, indem ein Ereignishandler für das Error
Ereignis erstellt wird. Das Erstellen eines Error
Ereignishandlers zum Protokollieren der Fehlerdetails und zum Benachrichtigen eines Entwicklers ist jedoch nicht erforderlich, da diese Aufgabe von ASP ausgeführt werden kann. Das System zur Integritätsüberwachung von NET.
Das Integritätsüberwachungssystem wurde in ASP.NET 2.0 eingeführt und wurde entwickelt, um die Integrität einer bereitgestellten ASP.NET Anwendung zu überwachen, indem Ereignisse protokolliert werden, die während der Lebensdauer der Anwendung oder Anforderung auftreten. Die vom Integritätsüberwachungssystem protokollierten Ereignisse werden als Integritätsüberwachungsereignisse oder Webereignisse bezeichnet und umfassen:
- Ereignisse der Anwendungslebensdauer, z. B. beim Starten oder Beenden einer Anwendung
- Sicherheitsereignisse, einschließlich fehlgeschlagener Anmeldeversuche und fehlgeschlagener URL-Autorisierungsanforderungen
- Anwendungsfehler, einschließlich unbehandelter Ausnahmen, Ansichtszustandsanalyseausnahmen, Anforderungsüberprüfungsausnahmen und Kompilierungsfehlern, unter anderem Fehlertypen.
Wenn ein Integritätsüberwachungsereignis ausgelöst wird, kann es bei einer beliebigen Anzahl von angegebenen Protokollquellen protokolliert werden. Das Integritätsüberwachungssystem wird mit Protokollquellen ausgeliefert, die Webereignisse in einer Microsoft SQL Server-Datenbank, im Windows-Ereignisprotokoll oder über eine E-Mail-Nachricht protokollieren. Sie können auch eigene Protokollquellen erstellen.
Die Ereignisse, die das Integritätsüberwachungssystem protokolliert, zusammen mit den verwendeten Protokollquellen, werden in Web.config
definiert. Mit einigen Zeilen Konfigurationsmarkup können Sie die Integritätsüberwachung verwenden, um alle unbehandelten Ausnahmen in einer Datenbank zu protokollieren und Sie per E-Mail über die Ausnahme zu benachrichtigen.
Erkunden der konfiguration des Systemüberwachung systems
Das Verhalten des Integritätsüberwachungssystems wird durch seine Konfigurationsinformationen definiert, die sich im Element Web.config
befinden<healthMonitoring>
. In diesem Konfigurationsabschnitt werden unter anderem die folgenden drei wichtigen Informationen definiert:
- Die Integritätsüberwachungsereignisse, die protokolliert werden sollen, wenn sie ausgelöst werden sollen,
- Die Protokollquellen und
- Wie jedes in (1) definierte Integritätsüberwachungsereignis den in (2) definierten Protokollquellen zugeordnet ist.
Diese Informationen werden durch drei untergeordnete Konfigurationselemente angegeben: <eventMappings>
, <providers>
, bzw <rules>
. .
Die Standardkonfigurationsinformationen zur Systemintegritätsüberwachung finden Sie in der Web.config
Datei im %WINDIR%\Microsoft.NET\Framework\version\CONFIG
Ordner. Diese Standardkonfigurationsinformationen, wobei einige Markups aus Platzgründen entfernt wurden, werden unten gezeigt:
<configuration>
<system.web>
<healthMonitoring>
<eventMappings>
<add name="All Errors" type="System.Web.Management.WebBaseErrorEvent,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>
<add name="Failure Audits" type="System.Web.Management.WebFailureAuditEvent,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>
</eventMappings>
<providers>
<add name="EventLogProvider" type="System.Web.Management.EventLogWebEventProvider,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"/>
<add connectionStringName="LocalSqlServer" maxEventDetailsLength="1073741823" buffer="false" bufferMode="Notification" name="SqlWebEventProvider" type="System.Web.Management.SqlWebEventProvider,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
<rules>
<add name="All Errors Default" eventName="All Errors" provider="EventLogProvider" profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:01:00" custom=""/>
<add name="Failure Audits Default" eventName="Failure Audits" provider="EventLogProvider" profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:01:00" custom=""/>
</rules>
</healthMonitoring>
</system.web>
</configuration>
Die von Interesse bezogenen Integritätsüberwachungsereignisse werden im <eventMappings>
Element definiert, das einer Klasse von Integritätsüberwachungsereignissen einen menschlichen Namen gibt. Im obigen Markup weist das <eventMappings>
Element den menschlichen Anzeigenamen "Alle Fehler" den Integritätsüberwachungsereignissen des Typs WebBaseErrorEvent
und den Namen "Failure Audits" zu Integritätsüberwachungsereignissen vom Typ WebFailureAuditEvent
zu.
Das <providers>
Element definiert die Protokollquellen und gibt ihm einen menschlichen Anzeigenamen und alle konfigurationsspezifischen Protokollinformationen an. Das erste <add>
Element definiert den Anbieter "EventLogProvider", der die angegebenen Integritätsüberwachungsereignisse mithilfe der EventLogWebEventProvider
Klasse protokolliert. Die EventLogWebEventProvider
Klasse protokolliert das Ereignis im Windows-Ereignisprotokoll. Das zweite <add>
Element definiert den Anbieter "SqlWebEventProvider", der Ereignisse über die SqlWebEventProvider
Klasse in einer Microsoft SQL Server-Datenbank protokolliert. Die Konfiguration "SqlWebEventProvider" gibt die Verbindungszeichenfolge (connectionStringName
) der Datenbank unter anderen Konfigurationsoptionen an.
Das <rules>
Element ordnet die im <eventMappings>
Element angegebenen Ereignisse protokollieren Quellen im <providers>
Element zu. Standardmäßig protokollieren ASP.NET Webanwendungen alle nicht behandelten Ausnahmen und Überwachungsfehler im Windows-Ereignisprotokoll.
Protokollieren von Ereignissen in einer Datenbank
Die Standardkonfiguration des Integritätsüberwachungssystems kann auf Webanwendungsbasis angepasst werden, indem der Datei der Anwendung Web.config
ein <healthMonitoring>
Abschnitt hinzugefügt wird. Sie können mithilfe des <add>
Elements zusätzliche Elemente in die <eventMappings>
Abschnitte und <providers>
<rules>
Abschnitte einfügen. Wenn Sie eine Einstellung aus der Standardkonfiguration entfernen möchten, verwenden Sie das <remove>
Element, oder entfernen <clear />
Sie alle Standardwerte aus einem dieser Abschnitte. Konfigurieren wir die Book Reviews-Webanwendung so, dass alle unbehandelten Ausnahmen mit der SqlWebEventProvider
Klasse in einer Microsoft SQL Server-Datenbank protokolliert werden.
Die SqlWebEventProvider
Klasse ist Teil des Integritätsüberwachungssystems und protokolliert ein Integritätsüberwachungsereignis in einer angegebenen SQL Server-Datenbank. Die SqlWebEventProvider
Klasse erwartet, dass die angegebene Datenbank eine gespeicherte Prozedur mit dem Namen aspnet_WebEvent_LogEvent
enthält. Diese gespeicherte Prozedur wird an die Details des Ereignisses übergeben und wird mit dem Speichern der Ereignisdetails beauftragt. Die gute Nachricht ist, dass Sie diese gespeicherte Prozedur oder die Tabelle zum Speichern der Ereignisdetails nicht erstellen müssen. Sie können diese Objekte mithilfe des aspnet_regsql.exe
Tools zu Ihrer Datenbank hinzufügen.
Hinweis
Das aspnet_regsql.exe
Tool wurde im Lernprogramm "Konfigurieren einer Website, die Anwendungsdienste verwendet" erläutert, als wir Unterstützung für ASP hinzugefügt haben. Die Anwendungsdienste von NET. Folglich enthält die Datenbank der Book Reviews-Website bereits die aspnet_WebEvent_LogEvent
gespeicherte Prozedur, die die Ereignisinformationen in einer Tabelle mit dem Namen aspnet_WebEvent_Events
speichert.
Sobald Sie die erforderliche gespeicherte Prozedur und Tabelle zu Ihrer Datenbank hinzugefügt haben, müssen Sie die Integritätsüberwachung anweisen, alle unbehandelten Ausnahmen in der Datenbank zu protokollieren. Dazu fügen Sie der Datei Ihrer Website Web.config
das folgende Markup hinzu:
<configuration>
...
<system.web>
...
<healthMonitoring enabled="true">
<eventMappings>
<clear />
<add name="All Errors" type="System.Web.Management.WebBaseErrorEvent"
startEventCode="0" endEventCode="2147483647" />
</eventMappings>
<providers>
<clear />
<add connectionStringName="ReviewsConnectionString" maxEventDetailsLength="1073741823"
buffer="false" name="SqlWebEventProvider"
type="System.Web.Management.SqlWebEventProvider" />
</providers>
<rules>
<clear />
<add name="All Errors Default" eventName="All Errors" provider="SqlWebEventProvider"
profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00" />
</rules>
</healthMonitoring>
</system.web>
</configuration>
Das oben beschriebene Konfigurationsmarkup für die Integritätsüberwachung verwendet <clear />
Elemente, um die vordefinierten Konfigurationsinformationen für die Integritätsüberwachung aus den <eventMappings>
Abschnitten , <providers>
und <rules>
den Abschnitten zu löschen. Anschließend wird jedem dieser Abschnitte ein einzelner Eintrag hinzugefügt.
- Das
<eventMappings>
Element definiert ein einzelnes Integritätsüberwachungsereignis mit dem Namen "Alle Fehler", das ausgelöst wird, wenn eine unbehandelte Ausnahme auftritt. - Das
<providers>
Element definiert eine einzelne Protokollquelle namens "SqlWebEventProvider", die dieSqlWebEventProvider
Klasse verwendet. DasconnectionStringName
Attribut wurde auf "ReviewsConnectionString" festgelegt, was der Name unserer im Abschnitt definierten<connectionStrings>
Verbindungszeichenfolge ist. - Schließlich gibt das <Regelelement> an, dass beim Transpirieren eines "All Errors"-Ereignisses, dass es mit dem Anbieter "SqlWebEventProvider" protokolliert werden soll.
Diese Konfigurationsinformationen weisen das Integritätsüberwachungssystem an, alle unbehandelten Ausnahmen in der Datenbank "Book Reviews" zu protokollieren.
Hinweis
Das WebBaseErrorEvent
Ereignis wird nur für Serverfehler ausgelöst. Es wird nicht für HTTP-Fehler ausgelöst, z. B. eine Anforderung für eine ASP.NET Ressource, die nicht gefunden wird. Dies unterscheidet sich vom Verhalten des HttpApplication
Klassenereignisses Error
, das sowohl für Server- als auch FÜR HTTP-Fehler ausgelöst wird.
Um das Integritätsüberwachungssystem in Aktion zu sehen, besuchen Sie die Website, und generieren Sie einen Laufzeitfehler durch Besuch Genre.aspx?ID=foo
. Sie sollten die entsprechende Fehlerseite sehen – entweder den Gelben Bildschirm "Ausnahmedetails" (beim Lokalen Besuch) oder die benutzerdefinierte Fehlerseite (beim Besuch der Website in der Produktion). Im Hintergrund protokollierte das Integritätsüberwachungssystem die Fehlerinformationen in der Datenbank. In der aspnet_WebEvent_Events
Tabelle sollte ein Datensatz vorhanden sein (siehe Abbildung 1). Dieser Datensatz enthält Informationen zu dem soeben aufgetretenen Laufzeitfehler.
Abbildung 1: Die Fehlerdetails wurden in der aspnet_WebEvent_Events
Tabelle protokolliert.
(Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Anzeigen des Fehlerprotokolls auf einer Webseite
Mit der aktuellen Konfiguration der Website protokolliert das Integritätsüberwachungssystem alle nicht behandelten Ausnahmen für die Datenbank. Die Integritätsüberwachung bietet jedoch keinen Mechanismus zum Anzeigen des Fehlerprotokolls über eine Webseite. Sie können jedoch eine ASP.NET Seite erstellen, auf der diese Informationen aus der Datenbank angezeigt werden. (Wie wir momentan sehen, können Sie die Fehlerdetails in einer E-Mail-Nachricht an Sie senden lassen.)
Wenn Sie eine solche Seite erstellen, stellen Sie sicher, dass Sie nur autorisierten Benutzern erlauben, die Fehlerdetails anzuzeigen. Wenn Ihre Website bereits Benutzerkonten verwendet, können Sie URL-Autorisierungsregeln verwenden, um den Zugriff auf die Seite auf bestimmte Benutzer oder Rollen einzuschränken. Weitere Informationen zum Gewähren oder Einschränken des Zugriffs auf Webseiten basierend auf dem angemeldeten Benutzer finden Sie in den Sicherheitslernprogrammen meiner Website.
Hinweis
Im folgenden Lernprogramm wird ein alternatives Fehlerprotokollierungs- und Benachrichtigungssystem namens ELMAH untersucht. ELMAH enthält einen integrierten Mechanismus zum Anzeigen des Fehlerprotokolls sowohl von einer Webseite als auch als RSS-Feed.
Protokollieren von Ereignissen in E-Mails
Das Integritätsüberwachungssystem enthält einen Protokollquellenanbieter, der ein Ereignis in einer E-Mail-Nachricht "protokolliert". Die Protokollquelle enthält die gleichen Informationen, die in der Datenbank im Textkörper der E-Mail-Nachricht protokolliert werden. Sie können diese Protokollquelle verwenden, um einen Entwickler zu benachrichtigen, wenn ein bestimmtes Integritätsüberwachungsereignis auftritt.
Aktualisieren wir die Konfiguration der Book Reviews-Website so, dass wir immer dann eine E-Mail erhalten, wenn eine Ausnahme auftritt. Dazu müssen wir drei Aufgaben ausführen:
- Konfigurieren Sie die ASP.NET Webanwendung zum Senden von E-Mails. Dazu wird angegeben, wie E-Mail-Nachrichten über das
<system.net>
Konfigurationselement gesendet werden. Weitere Informationen zum Senden von E-Mail-Nachrichten in einer ASP.NET Anwendung finden Sie unter "Senden von E-Mails in ASP.NET " und "System.Net.Mail". - Registrieren des E-Mail-Protokollquellanbieters im
<providers>
Element und - Fügen Sie dem Element einen Eintrag hinzu
<rules>
, der das Ereignis "Alle Fehler" dem in Schritt (2) hinzugefügten Protokollquellanbieter zuordnet.
Das Integritätsüberwachungssystem enthält zwei Klassen des Anbieters für E-Mail-Protokolle: SimpleMailWebEventProvider
und TemplatedMailWebEventProvider
. Die SimpleMailWebEventProvider
Klasse sendet eine Nur-Text-E-Mail-Nachricht, die die Ereignisdetails enthält und wenig Anpassungen des E-Mail-Textkörpers bereitstellt. Mit der TemplatedMailWebEventProvider
Klasse geben Sie eine ASP.NET Seite an, deren gerendertes Markup als Textkörper für die E-Mail-Nachricht verwendet wird. Die TemplatedMailWebEventProvider
Klasse bietet Ihnen viel mehr Kontrolle über den Inhalt und das Format der E-Mail-Nachricht, erfordert jedoch ein bisschen mehr Vorabarbeit, da Sie die ASP.NET Seite erstellen müssen, die den Text der E-Mail-Nachricht generiert. Dieses Lernprogramm konzentriert sich auf die Verwendung des SimpleMailWebEventProvider
Kurses.
Aktualisieren Sie das Element des Integritätsüberwachungssystems <providers>
in der Web.config
Datei, um eine Protokollquelle für die SimpleMailWebEventProvider
Klasse einzuschließen:
<providers>
<clear />
<add type="System.Web.Management.SimpleMailWebEventProvider"
name="EmailWebEventProvider" buffer="false"
from="support@example.com" to="support@example.com"
subjectPrefix="Book Reviews Runtime Error: " />
<add connectionStringName="ReviewsConnectionString" maxEventDetailsLength="1073741823"
buffer="false" name="SqlWebEventProvider"
type="System.Web.Management.SqlWebEventProvider" />
</providers>
Das obige Markup verwendet die SimpleMailWebEventProvider
Klasse als Protokollquellanbieter und weist sie dem Anzeigenamen "EmailWebEventProvider" zu. Darüber hinaus enthält das <add>
Attribut zusätzliche Konfigurationsoptionen, z. B. die An- und Von-Adressen der E-Mail-Nachricht.
Nachdem die E-Mail-Protokollquelle definiert wurde, müssen Sie das Integritätsüberwachungssystem anweisen, diese Quelle zum Protokollieren unbehandelter Ausnahmen zu verwenden. Dazu fügen Sie eine neue Regel im <rules>
Abschnitt hinzu:
<rules>
<clear />
<add name="All Errors To Email" eventName="All Errors" provider="EmailWebEventProvider"
profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00" />
<add name="All Errors To Database" eventName="All Errors" provider="SqlWebEventProvider"
profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00" />
</rules>
Der <rules>
Abschnitt enthält jetzt zwei Regeln. Der erste Mit dem Namen "Alle Fehler an E-Mail" sendet alle unbehandelten Ausnahmen an die Protokollquelle "EmailWebEventProvider". Diese Regel hat auswirkungen auf das Senden von Details zu Fehlern auf der Website an die angegebene To-Adresse. Die Regel "Alle Fehler in Datenbank" protokolliert die Fehlerdetails in der Datenbank der Website. Daher werden bei jedem Auftreten einer unbehandelten Ausnahme auf der Website ihre Details sowohl bei der Datenbank protokolliert als auch an die angegebene E-Mail-Adresse gesendet.
Abbildung 2 zeigt die von der SimpleMailWebEventProvider
Klasse generierte E-Mail beim Besuch Genre.aspx?ID=foo
.
Abbildung 2: Die Fehlerdetails werden in einer E-Mail-Nachricht gesendet
(Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Zusammenfassung
Das ASP.NET Integritätsüberwachungssystem ist so konzipiert, dass Administratoren den Status einer bereitgestellten Webanwendung überwachen können. Integritätsüberwachungsereignisse werden ausgelöst, wenn bestimmte Aktionen auftreten, z. B. wenn die Anwendung beendet wird, wenn sich ein Benutzer erfolgreich bei der Website anmeldet oder wenn eine unbehandelte Ausnahme auftritt. Diese Ereignisse können bei einer beliebigen Anzahl von Protokollquellen protokolliert werden. In diesem Lernprogramm wurde gezeigt, wie Sie die Details von unbehandelten Ausnahmen in einer Datenbank und über eine E-Mail-Nachricht protokollieren.
Dieses Lernprogramm befasste sich mit der Verwendung der Integritätsüberwachung zum Protokollieren unbehandelter Ausnahmen. Beachten Sie jedoch, dass die Integritätsüberwachung so konzipiert ist, dass die Gesamtintegrität einer bereitgestellten ASP.NET Anwendung gemessen wird und eine Fülle von Integritätsüberwachungsereignissen und Protokollquellen enthält, die hier nicht untersucht wurden. Darüber hinaus können Sie eigene Integritätsüberwachungsereignisse und Protokollquellen erstellen, wenn dies erforderlich ist. Wenn Sie mehr über die Gesundheitsüberwachung erfahren möchten, besteht ein guter erster Schritt darin, die Häufig gestellten Fragen zur Gesundheitsüberwachung von Erik Reitan zu lesen. Im Folgenden finden Sie unter How To: Use Systemüberwachung ing in ASP.NET 2.0.
Glückliche Programmierung!
Weitere nützliche Informationen
Weitere Informationen zu den in diesem Lernprogramm erläuterten Themen finden Sie in den folgenden Ressourcen:
- ASP.NET Übersicht über die Integritätsüberwachung
- Konfigurieren und Anpassen des Systemüberwachung-Systems von ASP.NET
- Häufig gestellte Fragen – Systemüberwachung ing in ASP.NET 2.0
- How To: Send E-Mail for Systemüberwachung ing Notifications
- How To: Use Systemüberwachung ing in ASP.NET
- Systemüberwachung in ASP.NET