Partager via


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

par Scott Mitchell

Le système de surveillance de l’intégrité de Microsoft offre un moyen facile et personnalisable de journaliser différents événements web, y compris les exceptions non gérées. Ce tutoriel explique comment configurer le système de surveillance de l’intégrité pour consigner les exceptions non gérées dans une base de données et informer les développeurs via un message électronique.

Introduction

La journalisation est un outil utile pour surveiller l’intégrité d’une application déployée et diagnostiquer les problèmes qui peuvent survenir. Il est particulièrement important de consigner 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 didacticiel précédent a montré comment avertir un développeur d’une erreur et consigner 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 consigner 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 déployée ASP.NET 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 exceptions non gérées, analyse des exceptions d’état d’affichage, exceptions de validation de requête et erreurs de compilation, entre autres types d’erreurs.

Lorsqu’un événement d’analyse d’intégrité est déclenché, il peut être journalisé sur un nombre quelconque de sources de journal spécifiées. Le système de surveillance de l’intégrité est fourni avec des sources de journaux qui consignent les événements Web dans une base de données Microsoft SQL Server, dans le journal des événements Windows ou via un e-mail, entre autres. Vous pouvez également créer vos propres sources de journal.

Les événements dans utilisant les journaux du système de surveillance de l’intégrité, ainsi que les sources de journal 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 enregistrer toutes les exceptions non gérées dans une base de données et vous avertir 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 informations importantes suivantes :

  1. Événements de surveillance de l’intégrité qui, lorsqu’ils sont déclenchés, doivent être enregistrés,
  2. Sources de journal et
  3. Comment chaque événement de surveillance de l’intégrité défini dans (1) est mappé aux sources de journal 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 %WINDIR%\Microsoft.NET\Framework\version\CONFIG le Web.config dossier. Ces informations de configuration par défaut, avec un balisage supprimé pour la concision, sont indiqué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é d’intérêt sont définis dans l’élément <eventMappings> , ce 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é du type WebBaseErrorEvent et le nom « Audits d’échec » aux événements de surveillance d’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 du journal. Le premier <add> élément définit le fournisseur « EventLogProvider », qui enregistre les événements de surveillance d’intégrité spécifiés à l’aide de la EventLogWebEventProvider classe. La EventLogWebEventProvider classe enregistre l’événement dans le journal des événements Windows. Le deuxième <add> élément définit le fournisseur « SqlWebEventProvider », qui enregistre les événements dans une base de données Microsoft SQL Server via la SqlWebEventProvider classe. La configuration « SqlWebEventProvider » spécifie l’chaîne de connexion de la base de données (connectionStringName) entre autres options de configuration.

L’élément <rules> mappe les événements spécifiés dans l’élément <eventMappings> pour journaliser les sources de 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 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 sections et <rules> les sections à l’aide <eventMappings><providers>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 consigner 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 consigne un événement de surveillance d’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 inclut une procédure stockée nommée aspnet_WebEvent_LogEvent. Cette procédure stockée est passée les détails de l’événement et est chargée de stocker les détails de l’événement. Les bonnes nouvelles sont 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 .

Remarque

L’outil aspnet_regsql.exe a été abordé dans le didacticiel Configuration d’un site web qui utilise Application Services lorsque nous avons ajouté la prise en charge d’ASP. Services d’application 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 d’é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, tout ce qui reste consiste à indiquer à la surveillance de l’intégrité de consigner 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 surveillance de l’intégrité ci-dessus utilise <clear /> des éléments pour réinitialiser les informations de configuration de surveillance de l’intégrité prédéfinies à partir des sections et <rules> des <eventMappings><providers>sections. Il ajoute ensuite une entrée unique à chacune de ces sections.

  • L’élément <eventMappings> définit un événement d’analyse d’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éfini dans la <connectionStrings> section.
  • Enfin, l’élément <de règles> indique que lorsqu’un événement « All Errors » se produit qu’il doit être journalisé à l’aide du fournisseur « SqlWebEventProvider ».

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

Remarque

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, 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 visitant Genre.aspx?ID=foo. Vous devez voir la page d’erreur appropriée : l’écran jaune des détails de l’exception (lors de la 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 aspnet_WebEvent_Events table (voir la figure 1) ; cet enregistrement contient des informations sur l’erreur d’exécution qui vient de se produire.

Capture d’écran qui fournit les détails d’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 de taille complète)

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 à 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 d’envoyer les détails de l’erreur à vous 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 à mes didacticiels sur la sécurité du site web.

Remarque

Le tutoriel suivant explore une autre journalisation des erreurs et un système de notification 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 à l’adresse e-mail

Le système de surveillance de l’intégrité inclut un fournisseur de source de journaux qui « enregistre » un événement à un e-mail. 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 d’intégrité se produit.

Nous allons mettre à jour la configuration du site web Book Reviews afin de recevoir 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 un e-mail. Pour ce faire, spécifiez la façon dont les messages électroniques sont envoyés via l’élément <system.net> de configuration. Pour plus d’informations sur l’envoi de messages électroniques dans une application ASP.NET, reportez-vous à l’envoi de courrier électronique dans ASP.NET et System.Net.Mail.
  2. Inscrire 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 du journal ajouté à l’étape (2).

Le système de surveillance de l’intégrité comprend deux classes de fournisseur de sources 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 que vous spécifiez une page ASP.NET dont le balisage rendu est utilisé comme corps du message électronique. La TemplatedMailWebEventProvider classe vous donne beaucoup plus de contrôle 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 du journal et lui attribue le nom convivial « EmailWebEventProvider ». En outre, l’attribut <add> inclut des options de configuration supplémentaires, telles que les adresses de destination et de départ du message électronique.

Avec la source du journal de messagerie définie, tout ce qui reste à indiquer au système de surveillance de l’intégrité d’utiliser cette source pour « journaliser » des 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 inclut maintenant deux règles. La première, nommée « Toutes les erreurs à l’e-mail », envoie toutes les exceptions non gérées à la source du journal « EmailWebEventProvider ». Cette règle a pour effet d’envoyer des détails sur les erreurs sur le site web à l’adresse à laquelle vous avez spécifié. La règle « Toutes les erreurs à la base de données » enregistre 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 tous les deux enregistré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 Genre.aspx?ID=foo.

Capture d’écran montrant les détails envoyés dans un e-mail.

Figure 2 : Les détails de l’erreur sont envoyés dans un message électronique
(Cliquez pour afficher l’image de taille complète)

Résumé

Le système de surveillance d’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 produisent, par exemple lorsque l’application s’arrête, lorsqu’un utilisateur se connecte correctement au site ou lorsqu’une exception non gérée 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 via un e-mail.

Ce didacticiel s’est concentré sur l’utilisation de la surveillance de l’intégrité pour consigner 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 ASP.NET déployée et inclut une multitude d’événements de surveillance de l’intégrité et de sources de journal non explorées ici. De plus, vous pouvez créer vos propres événements de surveillance de l’intégrité et sources de journalisation, si le besoin est nécessaire. Si vous souhaitez en savoir plus sur la surveillance de l’intégrité, une bonne première étape consiste à lire le FAQ sur la surveillance de l’intégrité d’Erik Reitan. Pour ce faire, consultez How To : Use Health Monitoring in ASP.NET 2.0.

Bonne programmation !

Pour aller plus loin

Pour plus d’informations sur les sujets abordés dans ce tutoriel, consultez les ressources suivantes :