Share via


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

von Scott Mitchell

Das System zur Integritätsüberwachung von Microsoft bietet eine einfache und anpassbare Möglichkeit zum Protokollieren verschiedener Webereignisse, einschließlich nicht behandelter Ausnahmen. In diesem Tutorial erfahren Sie, wie Sie das System für die Integritätsüberwachung einrichten, um nicht behandelte Ausnahmen in einer 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 Sie einen Entwickler über einen Fehler benachrichtigen und dessen Details protokollieren, indem Sie einen Ereignishandler für das Error Ereignis erstellen. Das Erstellen eines Error Ereignishandlers, um die Fehlerdetails zu protokollieren und einen Entwickler zu benachrichtigen, ist jedoch nicht erforderlich, da diese Aufgabe von ASP ausgeführt werden kann. System zur Integritätsüberwachung von NET.

Das System zur Integritätsüberwachung wurde in ASP.NET 2.0 eingeführt und dient zum Überwachen der Integrität einer bereitgestellten ASP.NET Anwendung, 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:

  • Ereignisse für die Anwendungslebensdauer, z. B. beim Starten oder Beenden einer Anwendung
  • 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 in einer beliebigen Anzahl von angegebenen Protokollquellen protokolliert werden. Das System zur Integritätsüberwachung enthält Protokollquellen, 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 Systemprotokolle der Integritätsüberwachung zusammen mit den verwendeten Protokollquellen enthalten, werden in Web.configdefiniert. Mit ein paar Zeilen Konfigurationsmarkup können Sie die Integritätsüberwachung verwenden, um alle nicht behandelten Ausnahmen in einer 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 Standardkonfigurationsinformationen für das System 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, 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 relevanten Integritätsüberwachungsereignisse werden im <eventMappings> -Element definiert, das einer Klasse von Integritätsüberwachungsereignissen einen benutzerfreundlichen Namen gibt. Im obigen Markup weist das <eventMappings> Element den Integritätsüberwachungsereignissen des Typs den Anzeigenamen "Alle Fehler" und Integritätsüberwachungsereignissen vom Typ WebBaseErrorEventWebFailureAuditEventden Namen "Fehlerüberwachungen" zu.

Das <providers> -Element definiert die Protokollquellen, gibt ihnen einen benutzerfreundlichen Namen 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 <eventMappings> -Element angegebenen Ereignisse Protokollquellen 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 Anwendungsdatei 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 /> um alle Standardwerte aus einem dieser Abschnitte zu entfernen. Konfigurieren wir die Webanwendung Book Reviews so, dass alle nicht behandelten Ausnahmen in einer 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 der Speicherung 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 Anwendungsdienste 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, die die Ereignisinformationen in einer Tabelle namens aspnet_WebEvent_Eventsspeichert.

Nachdem Sie der Datenbank die erforderliche gespeicherte Prozedur und Tabelle hinzugefügt haben, müssen Sie die Integritätsüberwachung lediglich anweisen, alle nicht behandelten Ausnahmen in der Datenbank zu protokollieren. Fügen Sie dazu das folgende Markup zur Datei Ihrer Website Web.config 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>

Im obigen Markup für die Integritätsüberwachungskonfiguration werden Elemente verwendet <clear /> , um die vordefinierten Konfigurationsinformationen für die 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, der Name der im <connectionStrings> Abschnitt definierten Verbindungszeichenfolge.
  • Schließlich gibt das <rules-Element> an, dass, wenn ein "All Errors"-Ereignis auftritt, dass es mit dem Anbieter "SqlWebEventProvider" protokolliert werden soll.

Diese Konfigurationsinformationen weisen das System für die Integritätsüberwachung an, alle nicht behandelten Ausnahmen in der Book Reviews-Datenbank 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 nicht gefundene ASP.NET Ressource. 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 System für die Integritätsüberwachung in Aktion zu sehen, besuchen Sie die Website, und generieren Sie einen Laufzeitfehler, indem Sie besuchen Genre.aspx?ID=foo. Die entsprechende Fehlerseite sollte angezeigt werden– entweder der gelbe Bildschirm mit den Ausnahmedetails des Todes (beim lokalen Besuch) oder die benutzerdefinierte Fehlerseite (beim Besuch der Website in der Produktion). Im Hintergrund protokollierte das System für die Integritätsüberwachung die Fehlerinformationen in der Datenbank. In der aspnet_WebEvent_Events Tabelle sollte ein Datensatz vorhanden sein (siehe Abbildung 1). Dieser Datensatz enthält Informationen zum gerade aufgetretenen Laufzeitfehler.

Screenshot: Fehlerdetails, die in der Tabelle protokolliert werden

Abbildung 1: 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 System für die Integritätsüberwachung alle nicht behandelten Ausnahmen in der 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 die Fehlerdetails in einer E-Mail-Nachricht an Sie senden lassen.)

Wenn Sie eine solche Seite erstellen, stellen Sie sicher, dass 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 unter My Website Security Tutorials.

Hinweis

Im folgenden Tutorial 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 zum Email

Das System zur Integritätsüberwachung 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 E-Mail-Nachrichtentext protokolliert werden. Sie können diese Protokollquelle verwenden, um einen Entwickler zu benachrichtigen, wenn ein bestimmtes Integritätsüberwachungsereignis auftritt.

Aktualisieren wir nun die Konfiguration der Buchbewertungswebsite, sodass wir bei jedem Auftreten einer Ausnahme eine E-Mail erhalten. 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 häufig gestellte Fragen zu System.Net.Mail.
  2. Registrieren Sie den E-Mail-Protokollquellanbieter im <providers> -Element, und
  3. Fügen Sie dem <rules> Element einen Eintrag hinzu, der das Ereignis "All Errors" dem in Schritt (2) hinzugefügten Protokollquellenanbieter zuordnet.

Das System für die Integritätsüberwachung 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 Anpassungen 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 bessere 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 Von-Adressen der E-Mail-Nachricht.

Nachdem die E-Mail-Protokollquelle definiert ist, müssen Sie das System für die Integritätsüberwachung lediglich anweisen, diese Quelle zum Protokollieren nicht behandelter Ausnahmen zu verwenden. 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 "All Errors To 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 "All Errors To Database" protokolliert die Fehlerdetails in der Datenbank des Standorts. Daher werden die Details, wenn eine nicht behandelte Ausnahme auf der Website auftritt, sowohl in der Datenbank protokolliert als auch an die angegebene E-Mail-Adresse gesendet.

Abbildung 2 zeigt die E-Mail, die von der SimpleMailWebEventProvider Klasse generiert wird, wenn sie besucht Genre.aspx?ID=foo.

Screenshot: In der E-Mail gesendete Fehlerdetails

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 System zur Integritätsüberwachung ist so konzipiert, dass Administratoren die Integrität 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 nicht behandelte Ausnahme auftritt. Diese Ereignisse können in einer beliebigen Anzahl von Protokollquellen protokolliert werden. In diesem Tutorial wurde gezeigt, wie Sie die Details zu nicht behandelten Ausnahmen in einer Datenbank und über eine E-Mail-Nachricht protokollieren.

Dieses Tutorial konzentrierte sich auf die Verwendung der Integritätsüberwachung zum Protokollieren von nicht behandelten Ausnahmen. Beachten Sie jedoch, dass die Integritätsüberwachung darauf ausgelegt ist, die Gesamtintegrität einer bereitgestellten ASP.NET-Anwendung zu messen und eine Vielzahl 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, ist ein guter erster Schritt, die Häufig gestellten Fragen zur Gesundheitsüberwachung von Erik Reitan zu lesen. 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 behandelten Themen finden Sie in den folgenden Ressourcen: