Menú de navegaciónMenú
Categorías

La mejor forma de Aprender Programación online y en español www.campusmvp.es

?id=47d6286e-2690-43aa-8ea5-2350c24e25b1

Dejando huella: cómo registrar eventos de nuestras aplicaciones (logging) con Log4Net

En numerosas ocasiones es necesario tener trazas de nuestra aplicación o registrar diferentes eventos que se producen en ella como pueden ser errores, control de acceso y autenticación, …

Log4Net es una librería licenciada bajo la Apache Software Licence, que nos permite incluir en nuestra aplicación la funcionalidad de “logging” de una forma rápida y sencilla. Con sólo cambiar el tipo de “appender” en el fichero de configuración. Podemos descargar la librería directamente desde su página o bien instalarla directamente en nuestra aplicación mediante nuget.

Vamos a ver un ejemplo sencillo utilizando Windows Presentation Foundation (WPF).

Lo primero es crear el proyecto de tipo aplicación de WPF.

log4net-logging-nuevo-proyecto-wpf

Seguidamente abrimos el gestor de paquetes de Nuget y buscamos Log4Net. Lo añadimos a la solución.

log4net-logging-nuget

Y ya podemos referenciar el ensamblado de log4Net. Para nuestro ejemplo vamos a inicializar el LogManager de log4Net en el constructor de la vista. Este LogManager es el encargado de obtener instancias del logger.

 public ILog Logger { get; set; }

 public MainWindow()
        {
            InitializeComponent();

            this.Logger = LogManager.GetLogger(Assembly.GetExecutingAssembly().GetTypes().First());
            log4net.Config.XmlConfigurator.Configure();

            this.Logger.Info("Inicio de la app");
        } 

Creamos una propiedad Logger que inicializamos para obtener una instancia que implementa la interfaz ILog en el ensamblado actual. Seguidamente y ¡muy importante! configuramos log4Net mediante XmlConfigurator, lo que hace que busque en el fichero de configuración de la aplicación (App.config), los datos que necesita.

 <?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>

  <log4net>
    <root>
      <level value="ALL"/>
      <appender-ref ref="FileAppender" />
    </root>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
      <file value="log-file.txt" />
      <appendToFile value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>
  </log4net>
</configuration>

Lo primero que observamos es la sección de configuración para poder utilizar log4net:

 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 

Luego le decimos el nivel de severidad que vamos a registrar:

  • Debug: usado con fines de “debugging” de código.
  • Info: trazas informativas normalmente de eventos o comportamiento.
  • Warn: para notificar de “warnings” en la aplicación.
  • Error: errores no fatales para registrar excepciones.
  • Fatal: nivel más severo para registrar errores fatales que llevan a una terminación de la aplicación.
  • ALL: captura todo tipo de severidades.
 <root>
      <level value="ALL"/>
      <appender-ref ref="FileAppender" />

</root>

También se especifica qué “appender” (tipo de registro de log) va a registrar ese nivel de severidad. En este ejemplo usamos el “FileAppender” que registrará en un archivo las trazas de la aplicación.

Log4Net tiene diferentes tipos de “appenders” como se puede ver en este enlace. Almacenamiento en base de datos (SQL Server, Oracle, SQLite, …), Asp.Net Appender, Buffer de almacenamiento antes de su volcado, consola, consola con distinción de colores, EventLog del sistema, NetSend, RolingFile, Smtp, son algunos de la gran variedad disponible de tipos de “Appenders”. En nuestro ejemplo:

 <appender name="FileAppender" type="log4net.Appender.FileAppender">
     <file value="Logs\log-file.txt" />
     <appendToFile value="true" />
     <layout type="log4net.Layout.PatternLayout">
       <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
     </layout>
   </appender>

Va a escribir nuestro “log” en el fichero log-file.txt ubicado dentro del directorio Logs de nuestra aplicación (si no existe lo crea), utilizando para cada traza el formato especificado en el patrón del tag conversionPattern.

De tal forma que obtendremos un fichero con el siguiente contenido:

2014-05-12 17:55:33,508 [10] INFO  SampleLoggingLog4Net.App [(null)] - Inicio de la app

¡Espero que os sea de utilidad y que dejéis huella de todo!

Joaquín Sosa Joaquín Sosa es MCP certificado y trabaja como Consultor de Desarrollo freelance especializado en tecnologías Microsoft en Pasiona. Cuenta con más de 10 años de experiencia en desarrollo y ha trabajado en diferentes plataformas: web, escritorio, y entornos móviles. Interesado en buenas prácticas de desarrollo, arquitecturas y metodologías ágiles. Puedes seguirlo en twitter en @joaquin_sosa Ver todos los posts de Joaquín Sosa

No te pierdas ningún post

Únete gratis a nuestro canal en Telegram y te avisaremos en el momento en el que publiquemos uno nuevo.

Archivado en: Lenguajes y plataformas

Comentarios (6) -

Hola;

Muchas gracias por la explicación.

Me surge la siguiente duda: cómo se hace para que se registren sólo los logs con nivel de seguridad por ejemplo de Info +
Error, o de Fatal+  Debug,+ Error, o de Info+Warn, etc, etc.

Un saludo.

Responder

Hola Álvaro, para lo que me comentas puedes usar filtros, como por ejemplo:

<filter type="log4net.Filter.LevelRangeFilter">
         <levelMin value="INFO" />
         <levelMax value="FATAL" />
</filter>

Échale un vistazo al siguiente post: www.codeproject.com/.../log4net_tutorial.aspx


Saludos.

Responder

Buenas noches, como tengo una aplicación con múltiples capas, como le digo que error del try de que capa va grabar su error. Tengo que copiar una línea de código a cada try catch?

Responder

Joaquín Sosa
Joaquín Sosa

Hola Bruno, gracias por leernos.

Todo depende de lo que realmente quieras "logar", por ejemplo si estás en la capa de acceso a datos (DAL) y quieres saber si la conexión con la base de datos ha ido mal,
será en ese punto donde tendrás que poner un try catch y una línea de log. Por ejemplo si tienes un servicio en la capa de aplicación o negocio que abre un fichero,
hace una llamada a un servicio web, necesitarás logarlos en este punto.
Lo que tendrías que hacer es configurar el log4net (XML) en la capa de presentación y añadir el paquete nuget del log4net a los demás proyectos.
Espero haberte guiado.
Saludos

Responder

miguel angel
miguel angel

hola, tengo una duda, también podría registrar los eventos o acciones que realice un usuario? como la hora de inicio de sesión, si agrega, modifica o elimina información. gracias anticipada por la respuesta.  

Responder

campusMVP
campusMVP

Hola Miguel Ángel:

Puedes loguear lo que necesites utilizando las funciones proporcionadas por la biblioteca.

Saludos

Responder

Agregar comentario