2010-06-07 7 views
13

Je veux pouvoir me connecter à chaque bloc de saisie. Quelque chose comme ça. Ensuite, les paramètres de la configuration accèderont à la propriété Message et StackTrace, etc., à l'aide du programme d'écoute du client (0). Je souhaite utiliser le bloc d'application de journalisation de la bibliothèque d'entreprise. Je suis sûr que quelqu'un a déjà fait ça.Comment enregistrer une exception dans un fichier?

Répondre

31

D'autres ont posté de bons liens pour faire fonctionner le LOG (Logging Application Block), donc je ne vais pas le dupliquer ici.

En termes de formatage de votre exception vous avez 3 choix que je peux penser:

  1. Utilisez la valeur par défaut Exception.ToString() mise en œuvre (c'est pas mal)
  2. Ecris une Formatter personnalisée qui intègre dans le LAB.
  3. Ecrivez une fonction d'assistance qui effectue la mise en forme et transmet la chaîne à la méthode Write.

Si l'option 1 ne répond pas à vos besoins, je vous recommande d'utiliser l'option 3 (car l'option 2 est trop lourde).

Un exemple simple serait quelque chose comme:

catch (Exception exception) 
    { 
     Logger.Write(LogHelper.CreateExceptionString(exception)); 
    } 

    ... 

    public static string CreateExceptionString(Exception e) 
    { 
     StringBuilder sb = new StringBuilder(); 
     CreateExceptionString(sb, e, String.Empty); 

     return sb.ToString(); 
    } 

    private static void CreateExceptionString(StringBuilder sb, Exception e, string indent) 
    { 
     if (indent == null) 
     { 
      indent = String.Empty; 
     } 
     else if (indent.Length > 0) 
     { 
      sb.AppendFormat("{0}Inner ", indent); 
     } 

     sb.AppendFormat("Exception Found:\n{0}Type: {1}", indent, e.GetType().FullName); 
     sb.AppendFormat("\n{0}Message: {1}", indent, e.Message); 
     sb.AppendFormat("\n{0}Source: {1}", indent, e.Source); 
     sb.AppendFormat("\n{0}Stacktrace: {1}", indent, e.StackTrace); 

     if (e.InnerException != null) 
     { 
      sb.Append("\n"); 
      CreateExceptionString(sb, e.InnerException, indent + " "); 
     } 
    } 
+0

Il est également utile d'inclure le nom du type d'exception. Mais sinon très bien. –

+1

@Andrew: oui ou vous pourriez ajouter du code pour extraire l'IDictionary de la propriété Data. –

+0

[ici] (http://www.aspsnippets.com/Articles/Create-simple-Error-Log-Text-File-in-ASPNet-using-C-and-VBNet.aspx) est une autre ** solution ** . l'espoir aide. – stom

0

Vous devez ajouter un programme d'écoute approprié pour les fichiers texte - voir this post, son pour ASP.NET mais les fichiers de configuration fonctionnent de la même manière dans les applications.

+0

Puis-je faire quelque chose pour passer directement objet d'exception afin qu'il donne trace de la pile détaillée etc. qui sera utile dans le débogage. – IsmailS

4

Microsoft a fourni vaste conseils sur ce ici: Developing Applications Using the Logging Application Block

Il vaut bien vous familiariser avec ce qu'ils ont à dire, comme il est assez puissant.

Si vous voulez quelque chose d'un peu plus bas sur la terre, quelques exemples de travail sont fournis dans cet article de blog: How To Configure and Use the Logging Application Block

Si vous rencontrez toujours des problèmes après la lecture de ceux-ci, éditer votre message avec des détails plus précis sur ce semble être le problème.

+0

Puis-je faire quelque chose pour passer directement l'objet d'exception afin qu'il donne une trace détaillée de la pile, ce qui sera utile pour le débogage? – IsmailS

+0

Vous pouvez créer une méthode assez simple et/ou un modèle string.format, puis l'utiliser lors de l'appel de Logger.Write. –

+0

Le lien de configuration va directement à la publicité. – sweetfa

1

@iSid Est-ce que vous demandez

public static void printException(Exception ex){ 
       Console.WriteLine("HelpLink = {0}", ex.HelpLink); 
       Console.WriteLine("Message = {0}", ex.Message); 
       Console.WriteLine("Source = {0}", ex.Source); 
       Console.WriteLine("StackTrace = {0}", ex.StackTrace); 
       Console.WriteLine("TargetSite = {0}", ex.TargetSite); 

      } 
Questions connexes