Question

Je travaille actuellement dans une entreprise qui possède de nombreuses applications personnalisées conçues en interne. Il n'y a pas actuellement de normes pour beaucoup de choses. Je voudrais mettre en place un moyen d’enregistrer / suivre les erreurs qui se produisent dans ce programme (la plupart sont asp.net).

Je pense actuellement à gérer cela dans Global.asax dans la méthode Erreur d'application. Essayez tout d’abord d’enregistrer les informations dans une base de données de journal des erreurs / suivi d’erreur et, si cela échoue, essayez d’envoyer un courrier électronique.

Quel type d'informations est le plus utile à obtenir du message d'erreur et d'autres variables d'application (page, nom d'utilisateur, etc.).

Je pense actuellement à utiliser deux tables, une pour obtenir l'erreur générale et les informations sur l'application, et une seconde qui contient les informations sur les exceptions. Ce sera une relation un à plusieurs à remettre aux exceptions internes pouvant provenir d'une exception au niveau de l'application.

Je suis sûr que beaucoup de détails me manquent et j'aimerais connaître votre stratégie pour gérer ce problème.

Était-ce utile?

La solution

Jeff Atwood a écrit un excellent gestionnaire d’exception à consulter sur CodeProject

J'essaierais de collecter autant d'informations que possible. Informations sur la pile Informations de session Lieu de l'erreur

Je voudrais également configurer un service Web que les applications appellent pour enregistrer les informations sur les exceptions dans votre système.

Autres conseils

Je pense que ELMAH est peut-être ce que vous recherchez.

Si vous utilisez une bibliothèque de journalisation (telle que Log4Net), vous pouvez configurer divers ajouts de journalisation pour se connecter à un courrier électronique, une base de données, un fichier, un journal des événements, etc. tout en ayant un seul appel de journal dans votre code. Ce post couvre tout ce dont vous avez besoin pour obtenir commencé.

Il existe également un suivi de l'état de santé ASP.NET .

EDIT: une autre affiche mentionnant ELMAH, qui est très utile pour enregistrer les erreurs ASP.NET et peut être injectée de manière dynamique dans les applications en cours d’exécution.

C’est ce que je fais et j’ai toujours un bogue à cause d’un problème de courrier électronique.

Je ne garde jamais rien sur la base de données, car si la base de données présente une erreur, je n'aurai jamais cette erreur sur la base de données, logiquement, l'insertion échouera!

J'envoie donc un courrier électronique à une adresse électronique spéciale telle que bugs@mondomaine.com

Objet : [nom de l'application] [horodatage: jjmmaaaa hhmmss] Message : application, message d'erreur, informations de trace de pile, ainsi que les variables de session telles que le nom d'utilisateur et les variables de serveur telles que le référent.

Le meilleur ami d'un développeur ASP.NET est les informations de traçage de la pile , c'est ici que vous saurez ce qui ne va pas, quel est l'appel et où il se appelait.

le seul problème que vous rencontrez dans ce système est que vous n'obtiendrez rien si le courrier électronique présente un problème (à quelques exceptions près lors de l'envoi du courrier électronique). Pour cela, j'ai commencé à ajouter à un fichier XML mensuel [errorLog_ mmm_yyyy.xml] également et a créé un simple " glisser-déposer " page avec un gridview qui a chargé le code XML pour le mois et l'année pour lesquels je voulais vérifier les erreurs.

try 
{
   // production code
}
catch(Exception ex)
{
   Utilities.Mail.SendError(ex);
}

ou le meilleur moyen: ajoutez-le à Erreur d'application dans global.asax:

<%@ Application Language="C#" %>
<%@ Import Namespace="System.Diagnostics" %>
<script language="C#" runat="server">
void Application_Error(object sender, EventArgs e)
{
   //get reference to the source of the exception chain
   Exception ex = Server.GetLastError().GetBaseException();

   //log the details of the exception and page state to the
   //Windows Event Log
   EventLog.WriteEntry("myWebApplication name",
     "MESSAGE: " + ex.Message + 
     "\nSOURCE: " + ex.Source +
     "\nFORM: " + Request.Form.ToString() + 
     "\nQUERYSTRING: " + Request.QueryString.ToString() +
     "\nTARGETSITE: " + ex.TargetSite +
     "\nSTACKTRACE: " + ex.StackTrace, 
     EventLogEntryType.Error);

   Utilities.Mail.SendError(ex);
}
</script>

avec le code ci-dessus, vous ajoutez l'erreur au journal des événements, j'ajoute l'erreur au fichier XML dans la fonction SendError (Exception).

Faites très attention lorsque vous enregistrez des informations potentiellement confidentielles qui sont arrivées via https. L'utilisateur s'attendra à ce qu'il soit crypté de bout en bout (ce qui peut être une obligation légale). Assurez-vous de ne pas l'envoyer par courrier électronique.

Normalement, je dirais de consigner toute la requête, y compris les requêtes get, post, cookies, état du formulaire (sous ASPNET), l'agent d'utilisateur, les autres en-têtes, la date / heure, la machine serveur, etc.

MAIS dans certains cas, cela entraînerait la consignation de certaines informations que vous n'êtes pas censé enregistrer de manière permanente (telles que le transfert de numéros de carte de crédit à un fournisseur de paiement). L'envoyer par courrier électronique est encore pire.

Cela vaut la peine de vérifier si le protocole HTTPS est activé et, le cas échéant, réduisez le nombre d'informations que vous enregistrez pour éviter ce problème. Je viens d'envoyer une chaîne pour indiquer si le champ était vide ou non.

On dirait en fait que vous avez assez bien pensé à la solution.

Je travaille dans une boutique de développement Web. Par conséquent, en plus des erreurs de journalisation, je m'assure également que toutes les erreurs critiques du système, telles que les requêtes de base de données en échec, etc., sont également envoyées par courrier électronique afin que nous puissions les corriger immédiatement.

Une autre solution à envisager consiste à envoyer chaque jour par e-mail un rapport contenant des informations sur chaque erreur générée dans chaque application et toute information pertinente souhaitée.

Nous enregistrons toutes nos erreurs dans une seule table pour cette application (bien sûr, cela est plus facile à faire lorsque vous travaillez sur des applications où les bases de données sont toutes contenues en interne), y compris l'horodatage de l'erreur et le texte complet du fichier. message d'exception qui a également été envoyé par courrier électronique.

Le message d'exception contient une trace de fonction afin que vous sachiez quelle était la fonction d'appel d'origine, ainsi que les numéros de fichier et de ligne de toutes les fonctions de la pile. Cela rend le suivi d'un bogue donné super simple.

En cas d'échec de la consignation dans la base de données, vous pouvez écrire dans le journal des événements du serveur ou dans un fichier Log.txt. Votre choix ici dépend en partie de votre accès aux serveurs Web contenant ceux-ci.

Envoi d’e-mails de notification d’erreur est une bonne idée si vous avez besoin d’une réponse rapide. Mais il n’existe pas de liste des erreurs à analyser.

Je le fais en créant une classe d’exception personnalisée spéciale avec des propriétés comprenant des informations sur l’utilisateur (ID, nom si disponible), toutes les variables de session, toutes les variables de formulaire (vous pouvez ainsi voir comment le formulaire a été rempli et ce utilisateur entré), et quelques indications au-delà de la trace de pile dans laquelle l’erreur s’est produite (quelle page, quelle classe, quelle méthode). Indiquez également le nom de la procédure stockée appelée et les paramètres envoyés, ou le code SQL lui-même. Également toutes les propriétés d'exception (trace de pile, etc.). Et champs DisplayMessage et InternalMessage. Le message DisplayMessage est affiché à l'utilisateur. InternalMessage est enregistré dans le journal et affiché sur la page d'erreur personnalisée en mode débogage.

Je me connecte à Page_Error sur la page de base et de manière sécurisée dans Application_Error.

Parfois, j'ajoute une paire clé-valeur dans web.config pour contenir mon adresse électronique (ou une liste de distribution). S'il y a une valeur dans cette clé, un courrier électronique de notification est envoyé. S'il n'y a pas de valeur, aucun courrier électronique n'est envoyé. Ensuite, lors de tests ou de début de production, je peux obtenir une notification personnelle immédiate du problème. Une fois la période initiale écoulée, je supprime l'adresse électronique dans web.config.

la journalisation est bonne, mais la la surveillance des applications est meilleure.

mise en garde: je suis l'auteur de CALM

Nous étions frustrés par les applications de rapport d’erreurs de sites Web qui existaient déjà. Nous avons donc écrit nos propres applications chez Clearwind Consulting. C'est gratuit et nous l'utilisons en interne pour nos projets. Il fournit des informations d'erreur complètes telles que les codes d'erreur complets, le type de navigateur, le suivi, un extrait du code qui a provoqué l'erreur, la fréquence des erreurs représentée graphiquement sur 30 jours et plus. Chez Clearwind, nous développons des applications Web. Nous avions besoin d’un outil qui nous donnerait de vraies données que nous pourrions utiliser efficacement sur nos sites Web.

Vous pouvez choisir comment recevoir une notification lorsque votre site Web génère une erreur. Les flux RSS, les e-mails ou toute autre méthode qui vous convient le mieux peuvent tous être utilisés pour obtenir des notifications d'erreur. Et oui, vous pouvez envoyer les erreurs sur votre iPhone pendant que vous prenez un verre. Il est entièrement écrit en Django afin que vous puissiez utiliser JSON, RoR, XML, CSV, etc. si vous souhaitez baliser ou formater vos données. Ou venez simplement sur le site Web.

Si vous le souhaitez, consultez le site www.areciboapp.com.

C’est gratuit, facile à ajouter (ou à supprimer) à n’importe quel site Web et qui fournit des informations réelles pour vous permettre de corriger les erreurs, plutôt que simplement un 404. Pas de vente difficile ici. Juste une invitation à venir jeter un coup d'œil et voir si cela pourrait vous aider, vous et votre site Web. Nous pensons que cela pourrait être le cas.

C’est une très bonne idée de vous connecter à un journal d’événements personnalisé sur le serveur, ainsi qu’à tout autre journal & amp; notification. Si l'erreur est due à un problème d'infrastructure, le même problème peut également empêcher le gestionnaire d'erreurs d'envoyer des courriels ou de l'enregistrer dans une base de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top