Freigeben über


Protokollieren von Fehlerdetails mit der ASP.NET-Systemüberwachung (VB)

von Scott Mitchell

Das Integritätsüberwachungssystem von Microsoft bietet eine einfache und anpassbare Möglichkeit, verschiedene Webereignisse, einschließlich nicht behandelter Ausnahmen, zu protokollieren. In diesem Tutorial wird das Einrichten des Integritätsüberwachungssystems beschrieben, um nicht behandelte Ausnahmen für eine Datenbank zu protokollieren und Entwickler per E-Mail zu benachrichtigen.

Einführung

Die Protokollierung ist ein nützliches Tool zum Überwachen der Integrität einer bereitgestellten Anwendung und zur Diagnose eventuell auftretender Probleme. Es ist besonders wichtig, Fehler zu protokollieren, die in einer bereitgestellten Anwendung auftreten, damit sie behoben werden können. Das Error Ereignis wird immer dann ausgelöst, wenn eine nicht behandelte Ausnahme in einer ASP.NET-Anwendung auftritt. Im vorherigen Tutorial wurde gezeigt, wie ein Entwickler über einen Fehler benachrichtigt und seine Details protokolliert wird, indem sie einen Ereignishandler für das Error Ereignis erstellen. Das Erstellen eines Error Ereignishandlers, um die Details des Fehlers zu protokollieren und einen Entwickler zu benachrichtigen, ist jedoch nicht erforderlich, da diese Aufgabe von ASP ausgeführt werden kann. NET-System zur Integritätsüberwachung.

Das Integritätsüberwachungssystem wurde in ASP.NET 2.0 eingeführt und ist für die Überwachung der Integrität einer bereitgestellten ASP.NET Anwendung konzipiert, 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 Folgendes:

  • Anwendungslebensdauerereignisse, z. B. wenn eine Anwendung gestartet oder beendet wird
  • Sicherheitsereignisse, einschließlich fehlgeschlagener Anmeldeversuche und fehlgeschlagener URL-Autorisierungsanforderungen
  • Anwendungsfehler, einschließlich nicht behandelter Ausnahmen, Anzeigen von Statusanalyseausnahmen, Anforderungsvalidierungsausnahmen 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 System zur Integritätsüberwachung wird mit Protokollquellen geliefert, die Webereignisse unter anderem 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 die Integritätsüberwachungssystemprotokolle zusammen mit den verwendeten Protokollquellen enthalten, werden in Web.configdefiniert. Mit einigen Zeilen Konfigurationsmarkup können Sie die Integritätsüberwachung verwenden, um alle nicht behandelten Ausnahmen für eine Datenbank zu protokollieren und Sie per E-Mail über die Ausnahme zu benachrichtigen.

Erkunden der Konfiguration des Integritätsüberwachungssystems

Das Verhalten des Integritätsüberwachungssystems wird durch seine Konfigurationsinformationen definiert, die sich im <healthMonitoring> -Element in Web.configbefinden. In diesem Konfigurationsabschnitt werden unter anderem die folgenden drei wichtigen Informationen definiert:

  1. Die Integritätsüberwachungsereignisse, die protokolliert werden sollen, wenn sie ausgelöst werden,
  2. Die Protokollquellen und
  3. Wie jedes in (1) definierte Integritätsüberwachungsereignis den in (2) definierten Protokollquellen zugeordnet wird.

Diese Informationen werden durch drei untergeordnete Konfigurationselemente angegeben: <eventMappings>, <providers>und <rules>.

Die Standardinformationen zur Systemkonfiguration für die Integritätsüberwachung finden Sie in der Web.config Datei im %WINDIR%\Microsoft.NET\Framework\version\CONFIG Ordner. Diese Standardkonfigurationsinformationen, wobei einige Markups aus Gründen der Kürze entfernt wurden, sind unten dargestellt:

<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 relevanten Integritätsüberwachungsereignisse werden im <eventMappings> -Element definiert, das einer Klasse von Integritätsüberwachungsereignissen einen menschlichen Namen gibt. Im obigen Markup weist das Element den <eventMappings> Integritätsüberwachungsereignissen vom Typ WebBaseErrorEvent den Anzeigenamen "Alle Fehler" und den Namen "Fehlerüberwachungsüberwachungsereignisse" zu Integritätsüberwachungsereignissen vom Typ WebFailureAuditEventzu.

Das <providers> -Element definiert die Protokollquellen, gibt ihnen einen Anzeigenamen und gibt alle protokollquellenspezifischen Konfigurationsinformationen 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 neben anderen Konfigurationsoptionen die Verbindungszeichenfolge (connectionStringName) der Datenbank an.

Das <rules> -Element ordnet die im -Element angegebenen Ereignisse zu <eventMappings> , um Quellen im <providers> -Element zu protokollieren. 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 zusätzliche Elemente in die <eventMappings>Abschnitte , <providers>und <rules> einschließen, indem Sie das <add> -Element verwenden. Um eine Einstellung aus der Standardkonfiguration zu entfernen, verwenden Sie das <remove> -Element oder verwenden <clear /> Sie, um alle Standardwerte aus einem dieser Abschnitte zu entfernen. Konfigurieren Wir die Webanwendung Book Reviews so, dass alle nicht behandelten Ausnahmen für eine Microsoft SQL Server-Datenbank mithilfe der SqlWebEventProvider -Klasse 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_LogEvententhält. Diese gespeicherte Prozedur wird die Details des Ereignisses übergeben und mit dem Speichern der Ereignisdetails beauftragt. Die gute Nachricht ist, dass Sie weder diese gespeicherte Prozedur noch die Tabelle zum Speichern der Ereignisdetails erstellen müssen. Sie können diese Objekte mit dem aspnet_regsql.exe Tool ihrer Datenbank hinzufügen.

Hinweis

Das aspnet_regsql.exe Tool wurde im Tutorial Konfigurieren einer Website, die Application Services verwendet, erläutert, als wir Unterstützung für ASP hinzugefügt haben. NET-Anwendungsdienste. Folglich enthält die Datenbank der Book Reviews-Website bereits die aspnet_WebEvent_LogEvent gespeicherte Prozedur, in der die Ereignisinformationen in einer Tabelle mit dem Namen aspnet_WebEvent_Eventsgespeichert werden.

Nachdem Sie der Datenbank die erforderliche gespeicherte Prozedur und Tabelle hinzugefügt haben, müssen Sie nur noch die Integritätsüberwachung anweisen, alle nicht behandelten Ausnahmen in der Datenbank zu protokollieren. Erreichen Sie dies, indem Sie der Datei Ihrer Website Web.config das folgende Markup hinzufügen:

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

Im obigen Markup für die Integritätsüberwachungskonfiguration werden Elemente verwendet <clear /> , um die vordefinierten Konfigurationsinformationen zur Integritätsüberwachung aus den <eventMappings>Abschnitten , <providers>und <rules> 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 nicht behandelte Ausnahme auftritt.
  • Das <providers> -Element definiert eine einzelne Protokollquelle namens "SqlWebEventProvider", die die SqlWebEventProvider -Klasse verwendet. Das connectionStringName Attribut wurde auf "ReviewsConnectionString" festgelegt, was der Name unserer im <connectionStrings> Abschnitt definierten Verbindungszeichenfolge ist.
  • Schließlich gibt das <Rules-Element> an, dass, wenn ein "All Errors"-Ereignis auftritt, es mithilfe des Anbieters "SqlWebEventProvider" protokolliert werden soll.

Diese Konfigurationsinformationen weisen das System zur Integritätsüberwachung an, alle nicht behandelten Ausnahmen für die Buchbewertungsdatenbank 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 -Ereignisses Error der HttpApplication -Klasse, 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, indem Sie besuchen Genre.aspx?ID=foo. Es sollte die entsprechende Fehlerseite angezeigt werden– entweder der gelbe Bildschirm für Ausnahmedetails des Todes (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. Es sollte ein Datensatz in der aspnet_WebEvent_Events Tabelle vorhanden sein (siehe Abbildung 1). Dieser Datensatz enthält Informationen zum gerade aufgetretenen Laufzeitfehler.

Screenshot: Fehlerdetails, die in der Tabelle protokolliert wurden

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 in 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 im Moment sehen werden, können Sie sich entscheiden, dass Die Fehlerdetails in einer E-Mail-Nachricht an Sie gesendet werden.)

Wenn Sie eine solche Seite erstellen, müssen Sie Schritte unternehmen, damit nur autorisierte Benutzer die Fehlerdetails anzeigen können. Wenn Ihre Website bereits Benutzerkonten verwendet, können Sie URL-Autorisierungsregeln verwenden, um den Zugriff auf die Seite auf bestimmte Benutzer oder Rollen zu beschränken. Weitere Informationen zum Gewähren oder Einschränken des Zugriffs auf Webseiten basierend auf dem angemeldeten Benutzer finden Sie in meinen Tutorials zur Websitesicherheit.

Hinweis

Im folgenden Tutorial wird ein alternatives Fehlerprotokollierungs- und Benachrichtigungssystem namens ELMAH untersucht. ELMAH enthält einen integrierten Mechanismus, um das Fehlerprotokoll sowohl von einer Webseite als auch als RSS-Feed anzuzeigen.

Protokollieren von Ereignissen in Email

Das Integritätsüberwachungssystem enthält einen Protokollquellenanbieter, der ein Ereignis mit einer E-Mail -Nachricht "protokolliert". Die Protokollquelle enthält dieselben Informationen, die in der Datenbank im E-Mail-Nachrichtentext protokolliert werden. Sie können diese Protokollquelle verwenden, um einen Entwickler zu benachrichtigen, wenn ein bestimmtes Integritätsüberwachungsereignis auftritt.

Lassen Sie uns die Konfiguration der Buchbewertungswebsite aktualisieren, sodass wir eine E-Mail erhalten, wenn eine Ausnahme auftritt. Um dies zu erreichen, müssen wir drei Aufgaben ausführen:

  1. Konfigurieren Sie die ASP.NET Webanwendung zum Senden von E-Mails. Dies wird erreicht, indem angegeben wird, 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 Email in ASP.NET und system.Net.Mail FAQ.
  2. Registrieren Sie den E-Mail-Protokollquellanbieter im <providers> -Element, und
  3. Fügen Sie dem Element einen Eintrag hinzu, der <rules> dem in Schritt (2) hinzugefügten Protokollquellenanbieter das Ereignis "Alle Fehler" zuordnet.

Das Integritätsüberwachungssystem umfasst zwei E-Mail-Protokollquellanbieterklassen: SimpleMailWebEventProvider und TemplatedMailWebEventProvider. Die SimpleMailWebEventProvider -Klasse sendet eine Nur-Text-E-Mail-Nachricht, die die Ereignisdetails enthält und wenig Anpassung des E-Mail-Texts bietet. 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 eine viel größere Kontrolle über den Inhalt und das Format der E-Mail-Nachricht, erfordert jedoch etwas mehr Vorabarbeit, da Sie die ASP.NET Seite erstellen müssen, die den Text der E-Mail-Nachricht generiert. Dieses Tutorial konzentriert sich auf die Verwendung der SimpleMailWebEventProvider -Klasse.

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 Protokollquellenanbieter und weist ihr den Anzeigenamen "EmailWebEventProvider" zu. Darüber hinaus enthält das <add> Attribut zusätzliche Konfigurationsoptionen, z. B. die An- und From-Adressen der E-Mail-Nachricht.

Wenn die E-Mail-Protokollquelle definiert ist, müssen Sie nur noch das Integritätsüberwachungssystem anweisen, diese Quelle zu verwenden, um nicht behandelte Ausnahmen zu "protokollieren". Dies wird durch Hinzufügen einer neuen Regel im <rules> Abschnitt erreicht:

<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 nun zwei Regeln. Die erste mit dem Namen "Alle Fehler an Email" sendet alle nicht behandelten Ausnahmen an die Protokollquelle "EmailWebEventProvider". Diese Regel bewirkt, dass Details zu Fehlern auf der Website an die angegebene An-Adresse gesendet werden. Die Regel "Alle Fehler in datenbank" protokolliert die Fehlerdetails in der Datenbank der Website. Wenn also eine nicht behandelte Ausnahme auf der Website auftritt, werden 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.

Screenshot: Details, die in einer E-Mail-Nachricht gesendet werden

Abbildung 2: Die Fehlerdetails werden in einer Email 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 die Integrität einer bereitgestellten Webanwendung überwachen können. Integritätsüberwachungsereignisse werden ausgelöst, wenn sich bestimmte Aktionen entfalten, z. B. wenn die Anwendung beendet wird, wenn sich ein Benutzer erfolgreich bei der Website anmeldet oder wenn eine nicht behandelte Ausnahme auftritt. Diese Ereignisse können bei einer beliebigen Anzahl von Protokollquellen protokolliert werden. In diesem Tutorial wurde gezeigt, wie Sie die Details nicht behandelter Ausnahmen in einer Datenbank und über eine E-Mail-Nachricht protokollieren.

Dieses Tutorial konzentrierte sich auf die Verwendung der Integritätsüberwachung zum Protokollieren nicht behandelter Ausnahmen. Beachten Sie jedoch, dass die Integritätsüberwachung darauf ausgelegt ist, die Gesamtintegrität einer bereitgestellten ASP.NET Anwendung zu messen und eine Fülle von Integritätsüberwachungsereignissen und Protokollquellen enthält, die hier nicht untersucht werden. Darüber hinaus können Sie bei Bedarf eigene Integritätsüberwachungsereignisse und Protokollquellen erstellen. Wenn Sie mehr über die Gesundheitsüberwachung erfahren möchten, sollten Sie sich zunächst die häufig gestellten Fragen zur Gesundheitsüberwachung von Erik Reitan durchlesen. Lesen Sie anschließend Vorgehensweise: Verwenden der Integritätsüberwachung in ASP.NET 2.0.

Viel Spaß beim Programmieren!

Weitere Informationen

Weitere Informationen zu den in diesem Tutorial erläuterten Themen finden Sie in den folgenden Ressourcen: