martes, 27 de diciembre de 2011

Logging con TraceSource

En el post anterior Log con Trace y Debug, trabajamos con las clases Trace y Debug para llevar a cabo la tarea de registrar la información de traza de nuestra aplicación. Aunque sigue siendo una práctica válida, ahora se recomienda usar la clase TraceSource para realizar el seguimiento de nuestra aplicación.

Como veremos a continuación, TraceSource mejora notablemente la configuración y uso que hacemos de las trazas en nuestras aplicaciones .NET, respecto a sus antecesores Debug y Trace.

La principal diferencia al trabajar con TraceSource es que necesitamos definir un origen de seguimiento. Una vez definido este origen, podremos agregar agentes de escucha (TraceListeners) que siguen al origen definido. Además, con TraceSource también configuraremos el nivel de información que queremos registrar a través de Switches, de forma mucho más intuitiva que con Debug y Trace.

De nuevo, también es posible trabajar con TraceSource tanto creándolo desde cero en nuestro código, cómo configurándolo a través de ficheros de configuración. En nuestro caso trabajaremos desde el fichero de configuración de nuestra aplicación (app.config).

Veamos un primer ejemplo para entrar en calor.

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <system.diagnostics>

    <sources>

      <source name="MyApp" switchName="MySwitch" switchType="System.Diagnostics.SourceSwitch">

        <listeners>

          <add name="MyListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="C:\Sergio.txt">

          </add>

        </listeners>

      </source>

    </sources>

    <switches>

      <add name="MySwitch" value="Warning"/>

    </switches>

  </system.diagnostics>

</configuration>


En este ejemplo hemos realizado las siguientes acciones:

  • Crear un origen de seguimiento llamado “MyApp”.
  • Determinar que el nivel de información registrada para nuestro origen, estará determinado por un Switch  llamado “MySwitch”, del tipo SourceSwitch.
  • Determinar que nuestro origen será escuchado por un agente de escucha del tipo llamado “MyListener”, del tipo TextWriterTraceListener.
  • Controlar que el nivel concreto de información registrada a través de “MySwitch” será el nivel “Warning”.

Aunque a priori esta solución podría parecer “el mismo perro pero con distinto collar”, la principal diferencia es que podemos crear tantos orígenes de seguimiento como creamos oportunos (varios en una misma aplicación, un origen por librería o componente, etc.), y de este modo configurar individualmente los agentes de escucha que registran la información del origen y que nivel de información se registra por cada origen de forma independiente.

Además, con TraceSource ya no utilizaremos métodos cómo WriteIf o WriteLineIf, sino que al escribir la información de traza especificaremos simplemente en que nivel está situado y el Switch hará el resto.

Ahora nuestro código C# será como el que sigue:

private static TraceSource ts = new TraceSource("MyApp");

 

static void Main(string[] args)

{

    // Con TraceEvent especificamos:

    //  Tipo de evento

    //  Identificador numérico libre

    //  Mensaje

    ts.TraceEvent(TraceEventType.Warning, 1, "Hola mundo!");

    ts.Close();

}


En este código:

  • Creamos una instancia de TraceSource para el origen de seguimiento “MyApp”.
  • Registramos información con el método TraceEvent, en el que especificamos además el nivel de la información registrada.
    • Además de TraceEvent también podemos utilizar métodos más especializados como TraceInformation o TraceData.
  • Finalmente, cerramos la instancia de TraceSource para que se vuelque la información al disco.
    • Si no quieres tener que preocuparte de llamar al método Flush o Close, podrías agregar <trace autoflush=”true” /> en <system.diagnostics> y funcionará igualmente.

El resultado del fichero es el siguiente:

MyApp Warning: 1 : Hola mundo!


Los valores más habituales de System.Diagnostics.TraceEventType y que a su vez son posibles valores para el atributo value del Switch de nuestro fichero app.config:

  • Critical
  • Error
  • Warning
  • Information
  • Verbose

Por supuesto también podemos en cualquier momento desactivar la traza con la siguiente configuración:

    <switches>

      <add name="MySwitch" value="Off"/>

    </switches>


Aunque en estos últimos dos posts hayamos visto Debug, Trace y TraceSource, lo cierto es que para operaciones de seguimiento también tenemos disponibles otro tipo de soluciones que no facilitarán la vida. Por ejemplo, log4net o Microsoft Enterprise Library con la sección Logging Application Block.

Un saludo!

1 comentario:

  1. Tengo interes en crear mi propia clase logger, la cual deseo pueda ser llamada desde diferentes assemblies en mi aplicacion y que me permita configurar diferentes salidas dependiendo de la necesidad del programador asi que apelando a tus conocimientos quisiera me ayudes con la partida inicial ayudandome con lo siguiente:
    - Una Clase de ejemplo de como lo harias tu muy basica con lo minimo.
    - Una explicacion de como hacer el vaciado a una tabla en la base de datos.
    y como curiosidad con respecto a el anterior articulo, aqui se sigue manejando alguna diferencia entre trace y debug es decir que pueda poner comentarios que solo corran durante el debug pero con TraceSource?

    ResponderEliminar