Mostrando entradas con la etiqueta log4net. Mostrar todas las entradas
Mostrando entradas con la etiqueta log4net. Mostrar todas las entradas

viernes, 3 de febrero de 2012

Algunos consejos más sobre log4net

Tras escribir el artículo introductorio sobre como trazar nuestras aplicaciones con log4net me di cuenta que podría ser útil comentar algunas cosillas que a mi fueron útiles para dejar la librería funcionando, ya que en las primeras pruebas (como era de suponer) no se registraba nada en la base de datos.

A la hora de crear nuestro logger usaremos un código similar a este
try 
{
  // ... código a trazar ...
}
catch (Exception ex)
{
  // Creamos nuestro logger
  ILogger logger = LogManager.GetLogger("Logger");
  // Cargamos la configuración
  XmlConfigurator.Configure();
  // Registramos nuestra excepción
  Logger.Error(ex.Message, ex);
}
Como vemos usaremos la cadena "Logger" para obtener la instancia a nuestro logger. Bien, este nombre debe ser el que pongamos en nuestro fichero de configuración.
  
    
      
        
        
      
    
      
Si esto no fuera así, log4net no podría cargar el logger correctamente y obtendríamos un error. Una vez que estaba seguro que el logger estaba instanciado correctamente, seguía viendo que no se registraba nada en la base de datos. Tras comprobar que la cadena de conexión era válida, y tras releerme un poco la documentación vi que había una propiedad en el fichero de configuración que se llamaba bufferSize. Esta propiedad como su nombre indica se encarga de guardar los registros hasta que se alcanza un número determinado, momento en el cual envia los registros a la salida configurada, en mi caso, la base de datos. El problema es que en mi caso se escriben sólo las excepciones que produce el programa por lo que tener un bufferSize de 100, me parecía excesivo, así que decidí ponerlo a 0 (sin buffer).
        
      
Con esto ya vi vi como todos los registros se almacenaban correctamente. Pero, ¿y si todo esto falla? Si todo esto falla tenemos otra alternativa y es hacer que el log4net nos informe de los errores que se comentan internamente en la librería. Para lograr esto, debemos añadir esto a nuestro <appsettings>
  
    
  
Para ver los errores en un fichero solo debemos redirigir la salida del TraceListener, por ejemplo, a un fichero de text añadiendo los siguiente a nuestro fichero de configuración
    
    
      
        
      
    
  
Con esto podremos ver la información que nos da log4net en su ejecución y quizá esto nos arroje algo de luz de por qué no se registran nuestros sucesos.

Happy coding!

Más info | Como trazar nuestras aplicaciones con log4net

martes, 31 de enero de 2012

Como trazar nuestras aplicaciones con log4net

En muchas ocasiones (por no decir en todas) es necesario guardar una traza de lo que hace nuestra aplicación. Esto se convierte en imprescindible cuando se produce una excepción no controlada ya que debemos ver que ha pasado, para en caso que sea necesario controlar esa excepción. Por ejemplo, suele ser muy útil cambiar el mensaje que ve el usuario final cuando se produce una excepción. Siempre será mejor ver "Se ha producido un error inesperado y este ha sido registrado. En caso que el problema persista contacte con administrador" que "Object reference not set to an instance of an object".

La mayoría de las veces el registro de errores suele llevarse a cabo guardando en un fichero de texto el mensaje de la excepción junto con las traza y la hora a la que se ha producido. También podemos incluir más información sobre el sistema operativo del equipo, versión del programa... En otros casos se opta por mandar un correo electrónico con la información del excepción o incluso podemos optar por hacer combinaciones de ambas, guardar la información en un fichero de texto y mandarlo por correo electrónico.

Escribir el código que realice las tareas anteriormente comentadas no es muy complicado pero implica gastar un número de horas y de recursos que en la mayoría de los proyectos no es posible. Por eso, a veces tenemos que buscar soluciones rápidas de implantar y si están ampliamente probadas mejor que mejor. En el peor de los caso solo tendremos que invertir un par de horas en leer la documentación para saber como utilizarla y a partir de ahí tan sólo haremos un copy & paste en todos nuestros proyectos.

Para empezar diré que la librería log4net es una herramienta que ayuda a registrar salidas en una amplia variedad de destinos. Esta librería es una migración de la librería log4j (log for java) y que también podemos encontrar para otros lenguajes como c++ o php.

Lo primero que debemos hacer para usar esta librería (después de leernos aunque sea por encima la documentación) es descargarla de la página oficial o través de nuget. Una vez descargada y añadida la referencia a nuestro proyecto debemos modificar nuestro fichero de configuración (app.config o web.config) añadiendo en la <configuration><configSections> lo siguiente



Luego, crearemos la sección log4net donde añadiremos el tipo de logger que vamos a usar, y que tipo de salida (appender) usaremos.  En mi caso usaré como salida el Sql Server, así que añadiremos lo siguiente a nuestro fichero de configuración

  
    
      
      
        
        
      
      
      
      
      
        
        
        
      
      
        
        
        
        
          
        
      
      
        
        
        
        
          
        
      
      
        
        
        
        
          
        
      
      
        
        
        
        
          
        
      
      
        
        
        
        
      
    
  

También debemos ejecutar el siguiente script sql en nuestra base de datos para almacenar los datos que queramos registrar.

CREATE TABLE [dbo].[Log] (
    [Id] [int] IDENTITY (1, 1) NOT NULL,
    [Date] [datetime] NOT NULL,
    [Thread] [varchar] (255) NOT NULL,
    [Level] [varchar] (50) NOT NULL,
    [Logger] [varchar] (255) NOT NULL,
    [Message] [varchar] (4000) NOT NULL,
    [Exception] [varchar] (2000) NULL
)

Llegados a este punto ya solo nos queda añadir un par de lineas a nuestro código y ya tendremos nuestro logger funcionando.

try 
{
  // ... código a trazar ...
}
catch (Exception ex)
{
  // Creamos nuestro logger
  ILogger logger = LogManager.GetLogger("Logger");
  // Cargamos la configuración
  XmlConfigurator.Configure();
  // Registramos nuestra excepción
  Logger.Error(ex.Message, ex);
}

Con poco esfuerzo y aprovechando un proyecto que funciona podemos trazar nuestras aplicaciones sin el mayor esfuerzo haciendo nuestras aplicaciones más robustas ya que podremos localizar más fácilmente nuestros puntos débiles y podremos corregirlos.

Como es de suponer log4net dispone de fábrica más appenders como por ejemplo
  • Log4net.Appender.AdoNetAppender
  • Log4net.Appender.AnsiColorTerminalAppender
  • Log4net.Appender.AspNetTraceAppender
  • Log4net.Appender.ColoredConsoleAppender
  • log4net.Appender.ConsoleAppender
  • log4net.Appender.DebugAppender
  • log4net.Appender.EventLogAppender
  • log4net.Appender.FileAppender
  • log4net.Appender.LocalSyslogAppender
  • log4net.Appender.MemoryAppender
  • log4net.Appender.NetSendAppender
  • log4net.Appender.OutputDebugStringAppender
  • log4net.Appender.RemoteSyslogAppender
  • log4net.Appender.RemotingAppender
  • log4net.Appender.RollingFileAppender
  • log4net.Appender.SmtpAppender
  • log4net.Appender.SmtpPickupDirAppender
  • log4net.Appender.TelnetAppender
  • log4net.Appender.TraceAppender
  • log4net.Appender.UdpAppender

Todos ellos listo para utilizar con muy poco esfuerzo. Para saber como usar estos appenders y como se pueden configurar recomiendo revisar la documentación oficial.

Happy coding!

Mas info | log4net