sábado, 5 de mayo de 2012

Direccionando el concepto de Tracing con AOP y PostSharp

En ingeniería de software, el tracing es una clase especializada de logging para recolectar información acerca de un programa en ejecución. Comúnmente esta información es utilizada por los programadores con el objetivo de depurar el código y dependiendo sobre todo del tipo y la información contenida en un log de traza (trace log), otras personas, tales como los administradores de sistemas o personal de soporte técnico pueden realizar detecciones y posibles soluciones a problemas comunes con algún software utilitario.


Con la siguiente tabla se trata de establecer algunas diferencias entre los conceptos de Tracing y Logging:

Diferencias entre Logging y Tracing


LoggingTracing
 Utilizados principalmente por administradores de sistemas. Utilizados principalmente por programadores.
 Registra informaciones de alto nivel y más amigables (ej. Instalación fallida de un programa)  Registra informaciones de bajo nivel y más crípticas (ej. Lanzamiento de una excepción)
 No debe ser “ruidoso”, es decir, no puede contener duplicación o información no relevante para la persona que lo va a auditar.  Puede ser “ruidoso”, pues generalmente se utiliza con fines de depuración.
 El formato de salida de la información debe o requiere ser estándar.  Pocas limitaciones en cuanto al formato de salida de la información.
 Los logs de eventos son a menudo localizadas, es decir, están expuestos en el idioma correspondiente a la región o país dado.  La localización no es una preocupación, comúnmente en las herramientas de tracing y los entornos de desarrollo en general se utilizan el idioma inglés.


A continuación presentamos un código sencillo de tracing en C# .net, lo que se expone aquí son dos trazas, una cuando ingresa al método realizando la traza del nombre del método y sus parámetros de entrada y otra al finalizar el método utilizando además otros parámetros:

Ejemplo de Tracing sin PostSharp

public bool Method(params string[] inputValues)
{
       Trace("Enter", "MethodName", inputValues);
       // Traza todos los parámetros de entrada al //ingresar al método
       bool someValue;
       Trace("Exit", "MethodName", someValue);
       // Traza los parámetros al abandonar el método
       return someValue;
}

En contra partida exponemos la diferencia con el mismo método (función) con PostSharp, podemos notar el mejor encapsulamiento de este aspecto no funcional, reduciendo las líneas de código y separando por ende las incumbencias funcionales y no funcionales y no tener además la necesidad de llamar al método de Trace tanto cuando ingresa al método o como cuando se acaba la ejecución del método:


Ejemplo de Tracing en AOP con PostSharp

[Trace]
public bool Method(params string[] inputValues)
{
         //hacer algo
}


La declaración y definición del aspecto de tracing se indica en el trozo de código siguiente:

Definición de Aspecto de Tracing en PostSharp


[Serializable]
public class TraceAttribute : OnMethodBoundaryAspect
{
          public override void OnEntry(MethodExecutionEventArgs eventArgs)
         {
                   Trace.TraceInformation("Ingresando {0}.", eventArgs.Method);
         }

         public override void OnExit(MethodExecutionEventArgs eventArgs)
        {
                   Trace.TraceInformation("Saliendo {0}.", eventArgs.Method);
        }
}

En esta definición del aspecto implementado en PostSharp podemos observar dos métodos sobrescritos (overrides) una para detectar la entrada al método con OnEntry y otra para la salida del mismo con OnExit y por ende evitar las llamadas del método Trace, cuando uno ingresa o sale del método así como lo implementa el código sin el paradigma de AOP.


No hay comentarios:

Publicar un comentario