2010-06-07 27 views
13

Quiero poder hacer el registro en cada bloque catch. Algo como esto.Cómo registrar la excepción en un archivo?

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

y luego los ajustes en la configuración recogerá el Mensaje y StackTrace etc establecimiento a través de escucha del cliente.

Me gustaría utilizar Enterprise Library Logging Application Block. Estoy seguro de que alguien ya debe haber hecho esto.

Respuesta

31

Otros han publicado buenos enlaces para que funcione el Bloque de aplicaciones de registro (LAB), por lo que no lo duplicaré aquí.

En términos de formato de su excepción que tienen 3 opciones que se me ocurren:

  1. utilizar la implementación predeterminada Exception.ToString() (no está mal)
  2. para tu dispositivo formateador personalizado que se integra en el laboratorio.
  3. Escriba una función auxiliar que realiza el formateo y pasa la cadena al método Write.

Si la opción 1 no satisface sus necesidades, entonces recomendaría ir con la opción 3 (ya que la opción 2 es excesiva).

Un ejemplo sencillo sería algo así como:

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

También es útil incluir el nombre del tipo de excepción. Pero por lo demás es bastante agradable. –

+1

@Andrew: sí o podría agregar algún código para extraer IDictionary de la propiedad Data. –

+0

[Aquí] (http://www.aspsnippets.com/Articles/Create-simple-Error-Log-Text-File-in-ASPNet-using-C-and-VBNet.aspx) es otra ** solución ** . la esperanza ayuda. – stom

0

Necesita agregar un oyente apropiado para los archivos de texto: consulte la publicación this, es para ASP.NET pero los archivos de configuración funcionan de la misma manera en todas las aplicaciones.

+0

¿Puedo hacer algo para pasar directamente objeto de excepción para que dé traza detallada pila etc. que será útil en la depuración. – IsmailS

4

Microsoft ha proporcionado extensa orientación sobre esto aquí: Developing Applications Using the Logging Application Block

Vale la pena familiarizarse con lo que tienen que decir, ya que es bastante potente.

Si quieres algo un poco más a la tierra, algunos ejemplos de trabajo se proporcionan en este artículo de blog: How To Configure and Use the Logging Application Block

Si sigue teniendo problemas después de leer esos, editar el post con más detalles específicos acerca de lo parece ser el problema.

+0

¿Puedo hacer algo para pasar directamente el objeto de excepción para que proporcione un seguimiento de pila detallado, etc. que será útil para la depuración? – IsmailS

+0

Puede crear un método bastante simple y/o una plantilla de string.format y luego usarlo cuando llame a Logger.Write. –

+0

El enlace de configuración va directamente a la publicidad. – sweetfa

1

@iSid Es esto lo que está pidiendo

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

      } 
Cuestiones relacionadas