Partager via


Journalisation des détails des erreurs avec la supervision de l’intégrité ASP.NET (C#)

par Scott Mitchell

Le système de surveillance de l’intégrité de Microsoft offre un moyen simple et personnalisable de journaliser divers événements web, y compris les exceptions non gérées. Ce tutoriel décrit la configuration du système de surveillance de l’intégrité pour journaliser les exceptions non gérées dans une base de données et avertir les développeurs par courrier électronique.

Introduction

La journalisation est un outil utile pour surveiller l’intégrité d’une application déployée et pour diagnostiquer les problèmes qui peuvent survenir. Il est particulièrement important de journaliser les erreurs qui se produisent dans une application déployée afin qu’elles puissent être corrigées. L’événement Error est déclenché chaque fois qu’une exception non gérée se produit dans une application ASP.NET ; le tutoriel précédent a montré comment notifier un développeur d’une erreur et enregistrer ses détails en créant un gestionnaire d’événements pour l’événement Error . Toutefois, la création d’un gestionnaire d’événements Error pour journaliser les détails de l’erreur et avertir un développeur n’est pas nécessaire, car cette tâche peut être effectuée par ASP. Système de surveillance de l’intégrité de NET.

Le système de surveillance de l’intégrité a été introduit dans ASP.NET 2.0 et est conçu pour surveiller l’intégrité d’une application ASP.NET déployée en journalisant les événements qui se produisent pendant la durée de vie de l’application ou de la demande. Les événements enregistrés par le système de surveillance de l’intégrité sont appelés événements de surveillance de l’intégrité ou événements web, et incluent :

  • Événements de durée de vie de l’application, tels que le démarrage ou l’arrêt d’une application
  • Événements de sécurité, y compris les tentatives de connexion ayant échoué et les demandes d’autorisation d’URL ayant échoué
  • Erreurs d’application, notamment les exceptions non gérées, les exceptions d’analyse d’état d’affichage, les exceptions de validation de demande et les erreurs de compilation, entre autres types d’erreurs.

Lorsqu’un événement de surveillance de l’intégrité est déclenché, il peut être journalisé dans n’importe quel nombre de sources de journal spécifiées. Le système de surveillance de l’intégrité est fourni avec des sources de journaux qui enregistrent des événements web dans une base de données Microsoft SQL Server, dans le journal des événements Windows ou via un message électronique, entre autres. Vous pouvez également créer vos propres sources de journal.

Les événements que le système de surveillance de l’intégrité journalise, ainsi que les sources de journaux utilisées, sont définis dans Web.config. Avec quelques lignes de balisage de configuration, vous pouvez utiliser la surveillance de l’intégrité pour journaliser toutes les exceptions non gérées dans une base de données et vous informer de l’exception par e-mail.

Exploration de la configuration du système de surveillance de l’intégrité

Le comportement du système de surveillance de l’intégrité est défini par ses informations de configuration, qui se trouvent dans l’élément<healthMonitoring> dans Web.config. Cette section de configuration définit, entre autres, les trois éléments d’information importants suivants :

  1. Les événements de surveillance de l’intégrité qui, lorsqu’ils sont déclenchés, doivent être consignés,
  2. Les sources de journaux, et
  3. Comment chaque événement de surveillance de l’intégrité défini dans (1) est mappé aux sources de journaux définies dans (2).

Ces informations sont spécifiées via trois éléments de configuration enfants : <eventMappings>, <providers>et <rules>, respectivement.

Les informations de configuration du système de surveillance de l’intégrité par défaut se trouvent dans le fichier dans le Web.config%WINDIR%\Microsoft.NET\Framework\version\CONFIG dossier . Ces informations de configuration par défaut, avec certains balisages supprimés pour des raisons de concision, sont présentées ci-dessous :

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

Les événements de surveillance de l’intégrité intéressants sont définis dans l’élément <eventMappings> , qui donne un nom convivial à une classe d’événements de surveillance de l’intégrité. Dans le balisage ci-dessus, l’élément <eventMappings> affecte le nom convivial « Toutes les erreurs » aux événements de surveillance d’intégrité de type WebBaseErrorEvent et le nom « Audits d’échec » aux événements de surveillance de l’intégrité de type WebFailureAuditEvent.

L’élément <providers> définit les sources de journal, en leur donnant un nom convivial et en spécifiant les informations de configuration spécifiques à la source de journal. Le premier <add> élément définit le fournisseur « EventLogProvider », qui journalise les événements de surveillance d’intégrité spécifiés à l’aide de la EventLogWebEventProvider classe . La EventLogWebEventProvider classe journalise l’événement dans le journal des événements Windows. Le deuxième <add> élément définit le fournisseur « SqlWebEventProvider », qui journalise les événements dans une base de données Microsoft SQL Server via la SqlWebEventProvider classe . La configuration « SqlWebEventProvider » spécifie la chaîne de connexion de la base de données (connectionStringName) parmi d’autres options de configuration.

L’élément <rules> mappe les événements spécifiés dans l’élément <eventMappings> aux sources de journal dans l’élément <providers> . Par défaut, ASP.NET applications web consignent toutes les exceptions non gérées et les échecs d’audit dans le journal des événements Windows.

Journalisation des événements dans une base de données

La configuration par défaut du système de surveillance de l’intégrité peut être personnalisée sur la base d’une application web par application web en ajoutant une <healthMonitoring> section au fichier de Web.config l’application. Vous pouvez inclure des éléments supplémentaires dans les <eventMappings>sections , <providers>et <rules> à l’aide de l’élément <add> . Pour supprimer un paramètre de la configuration par défaut, utilisez l’élément <remove> ou utilisez <clear /> pour supprimer toutes les valeurs par défaut de l’une de ces sections. Nous allons configurer l’application web Book Reviews pour journaliser toutes les exceptions non gérées dans une base de données Microsoft SQL Server à l’aide de la SqlWebEventProvider classe .

La SqlWebEventProvider classe fait partie du système de surveillance de l’intégrité et enregistre un événement de surveillance de l’intégrité dans une base de données SQL Server spécifiée. La SqlWebEventProvider classe s’attend à ce que la base de données spécifiée inclue une procédure stockée nommée aspnet_WebEvent_LogEvent. Cette procédure stockée est transmise aux détails de l’événement et est chargée de stocker les détails de l’événement. La bonne nouvelle est que vous n’avez pas besoin de créer cette procédure stockée ni la table pour stocker les détails de l’événement. Vous pouvez ajouter ces objets à votre base de données à l’aide de l’outil aspnet_regsql.exe .

Notes

L’outil aspnet_regsql.exe a été abordé dans le didacticiel Configuration d’un site web qui utilise des services d’application lorsque nous avons ajouté la prise en charge d’ASP. Services d’application de NET. Par conséquent, la base de données du site web Book Reviews contient déjà la aspnet_WebEvent_LogEvent procédure stockée, qui stocke les informations sur l’événement dans une table nommée aspnet_WebEvent_Events.

Une fois que vous avez ajouté la procédure stockée et la table nécessaires à votre base de données, il ne vous reste plus qu’à indiquer à la surveillance de l’intégrité de journaliser toutes les exceptions non gérées dans la base de données. Pour ce faire, ajoutez le balisage suivant au fichier de Web.config votre site web :

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

Le balisage de configuration de la surveillance de l’intégrité ci-dessus utilise des <clear /> éléments pour réinitialiser les informations de configuration de surveillance de l’intégrité <eventMappings>prédéfinies des sections , <providers>et <rules> . Il ajoute ensuite une seule entrée à chacune de ces sections.

  • L’élément <eventMappings> définit un événement de surveillance de l’intégrité unique d’intérêt nommé « Toutes les erreurs », qui est déclenché chaque fois qu’une exception non gérée se produit.
  • L’élément <providers> définit une source de journal unique nommée « SqlWebEventProvider » qui utilise la SqlWebEventProvider classe . L’attribut connectionStringName a été défini sur « ReviewsConnectionString », qui est le nom de notre chaîne de connexion définie dans la <connectionStrings> section .
  • Enfin, l’élément <rules> indique que lorsqu’un événement « Toutes les erreurs » se produit, il doit être journalisé à l’aide du fournisseur « SqlWebEventProvider ».

Ces informations de configuration indiquent au système de surveillance de l’intégrité de journaliser toutes les exceptions non gérées dans la base de données Book Reviews.

Notes

L’événement WebBaseErrorEvent est déclenché uniquement pour les erreurs de serveur ; il n’est pas déclenché pour les erreurs HTTP, telles qu’une demande d’une ressource ASP.NET introuvable. Cela diffère du comportement de l’événement de Error la HttpApplication classe, qui est déclenché pour les erreurs serveur et HTTP.

Pour voir le système de surveillance de l’intégrité en action, visitez le site web et générez une erreur d’exécution en accédant à Genre.aspx?ID=foo. Vous devriez voir la page d’erreur appropriée : l’écran jaune détails de l’exception de la mort (lors d’une visite locale) ou la page d’erreur personnalisée (lors de la visite du site en production). En arrière-plan, le système de surveillance de l’intégrité a enregistré les informations d’erreur dans la base de données. Il doit y avoir un enregistrement dans la table (voir la aspnet_WebEvent_Eventsfigure 1) ; cet enregistrement contient des informations sur l’erreur d’exécution qui vient de se produire.

Capture d’écran montrant les détails de l’erreur enregistrés dans la table.

Figure 1 : Les détails de l’erreur ont été enregistrés dans la aspnet_WebEvent_Events table
(Cliquez pour afficher l’image en taille réelle)

Affichage du journal des erreurs dans une page web

Avec la configuration actuelle du site web, le système de surveillance de l’intégrité consigne toutes les exceptions non gérées dans la base de données. Toutefois, la surveillance de l’intégrité ne fournit aucun mécanisme permettant d’afficher le journal des erreurs via une page web. Toutefois, vous pouvez créer une page ASP.NET qui affiche ces informations à partir de la base de données. (Comme nous le verrons momentanément, vous pouvez choisir que les détails de l’erreur vous soient envoyés dans un e-mail.)

Si vous créez une telle page, veillez à prendre des mesures pour autoriser uniquement les utilisateurs autorisés à afficher les détails de l’erreur. Si votre site utilise déjà des comptes d’utilisateur, vous pouvez utiliser des règles d’autorisation d’URL pour restreindre l’accès à la page à certains utilisateurs ou rôles. Pour plus d’informations sur la façon d’accorder ou de restreindre l’accès aux pages web en fonction de l’utilisateur connecté, reportez-vous aux didacticiels sur la sécurité de mon site web.

Notes

Le tutoriel suivant explore un autre système de journalisation et de notification des erreurs nommé ELMAH. ELMAH inclut un mécanisme intégré pour afficher le journal des erreurs à partir d’une page web et en tant que flux RSS.

Journalisation des événements dans Email

Le système de surveillance de l’intégrité inclut un fournisseur de source de journaux qui « journalise » un événement dans un message électronique. La source du journal inclut les mêmes informations que celles enregistrées dans la base de données dans le corps du message électronique. Vous pouvez utiliser cette source de journal pour avertir un développeur lorsqu’un événement de surveillance de l’intégrité se produit.

Nous allons mettre à jour la configuration du site web Book Reviews afin que nous recevions un e-mail chaque fois qu’une exception se produit. Pour ce faire, nous devons effectuer trois tâches :

  1. Configurez l’application web ASP.NET pour envoyer des e-mails. Pour ce faire, spécifiez la façon dont les messages électroniques sont envoyés via l’élément de <system.net> configuration. Pour plus d’informations sur l’envoi de courriers électroniques dans une application ASP.NET, consultez Envoi de Email dans ASP.NET et faq sur System.Net.Mail.
  2. Inscrivez le fournisseur de source du journal de messagerie dans l’élément <providers> et
  3. Ajoutez une entrée à l’élément <rules> qui mappe l’événement « Toutes les erreurs » au fournisseur de source de journal ajouté à l’étape (2).

Le système de surveillance de l’intégrité comprend deux classes de fournisseur de source de journaux d’e-mail : SimpleMailWebEventProvider et TemplatedMailWebEventProvider. La SimpleMailWebEventProvider classe envoie un message électronique en texte brut qui inclut les détails de l’événement et fournit peu de personnalisation du corps de l’e-mail. Avec la TemplatedMailWebEventProvider classe , vous spécifiez une page ASP.NET dont le balisage rendu est utilisé comme corps du message électronique. La TemplatedMailWebEventProvider classe vous donne un contrôle beaucoup plus important sur le contenu et le format du message électronique, mais nécessite un peu plus de travail initial, car vous devez créer la page ASP.NET qui génère le corps du message électronique. Ce tutoriel se concentre sur l’utilisation de la SimpleMailWebEventProvider classe .

Mettez à jour l’élément du système de surveillance de <providers> l’intégrité dans le Web.config fichier pour inclure une source de journal pour la SimpleMailWebEventProvider classe :

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

Le balisage ci-dessus utilise la SimpleMailWebEventProvider classe comme fournisseur de source de journal et lui attribue le nom convivial « EmailWebEventProvider ». En outre, l’attribut <add> inclut des options de configuration supplémentaires, telles que les adresses À et De du message électronique.

Une fois la source du journal d’e-mail définie, il ne reste plus qu’à demander au système de surveillance de l’intégrité d’utiliser cette source pour « journaliser » les exceptions non gérées. Pour ce faire, ajoutez une nouvelle règle dans la <rules> section :

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

La <rules> section comprend désormais deux règles. La première, nommée « Toutes les erreurs à Email », envoie toutes les exceptions non gérées à la source de journal « EmailWebEventProvider ». Cette règle a pour effet d’envoyer des détails sur les erreurs sur le site web à l’adresse À spécifiée. La règle « Toutes les erreurs dans la base de données » consigne les détails de l’erreur dans la base de données du site. Par conséquent, chaque fois qu’une exception non gérée se produit sur le site, ses détails sont consignés dans la base de données et envoyés à l’adresse e-mail spécifiée.

La figure 2 montre l’e-mail généré par la classe lors de la SimpleMailWebEventProvider visite de Genre.aspx?ID=foo.

Capture d’écran montrant les détails de l’erreur envoyés dans le message électronique.

Figure 2 : Les détails de l’erreur sont envoyés dans un message Email
(Cliquez pour afficher l’image en taille réelle)

Résumé

Le système de surveillance de l’intégrité ASP.NET est conçu pour permettre aux administrateurs de surveiller l’intégrité d’une application web déployée. Les événements de surveillance de l’intégrité sont déclenchés lorsque certaines actions se déroulent, par exemple lorsque l’application s’arrête, lorsqu’un utilisateur se connecte correctement au site ou lorsqu’une exception non prise en charge se produit. Ces événements peuvent être consignés dans n’importe quel nombre de sources de journal. Ce tutoriel a montré comment consigner les détails des exceptions non gérées dans une base de données et par le biais d’un message électronique.

Ce tutoriel s’est concentré sur l’utilisation de la surveillance de l’intégrité pour journaliser les exceptions non gérées, mais gardez à l’esprit que la surveillance de l’intégrité est conçue pour mesurer l’intégrité globale d’une application de ASP.NET déployée et inclut une multitude d’événements de surveillance de l’intégrité et de sources de journaux qui ne sont pas explorées ici. De plus, vous pouvez créer vos propres événements de surveillance de l’intégrité et vos propres sources de journal, le cas échéant. Si vous souhaitez en savoir plus sur la surveillance de l’intégrité, une première étape consiste à lire le FAQ sur la surveillance de l’intégritéd’Erik Reitan. Ensuite, consultez Guide pratique pour utiliser la surveillance de l’intégrité dans ASP.NET 2.0.

Bonne programmation!

En savoir plus

Pour plus d’informations sur les sujets abordés dans ce tutoriel, reportez-vous aux ressources suivantes :