jueves, 24 de mayo de 2007

Logging Application Block EntLib 3

En esta ocasión y para que se entienda un poco lo que hay en el video del post anterior vamos a hacer un paso a paso de cómo utilizar el logging application block del Enterprise Library 3.0. Cada uno saque sus conclusiones pero les anticipo que LAB (logging application block) es, a mi entender, mucho más potente que Log4Net. Bueno, comencemos, vamos con un par de conceptos. -Trace Listener: Son los encargados de escribir los datos en un destino en particular, por ejemplo tenemos FlatFile (escribe en un archivo de texto plano), Formatted Event Log (escribe en el log de eventos de windows) y muchos otros, además de los que podemos crear nosotros mismos. -Formatters: Son los encargados de dar formato al mensaje, utilizan un Template (patrón) para formatear el mensaje, para incluir por ejemplo el nombre, la hora, etc. Los Trace Listeners utilizan Formatters para escribir la información. También podemos escribir nuestros Formatters. -Sources: Son los orígenes, permiten configurar las categorías de mensajes y definir que Trace Listener se utilizará para logar los mensajes que encajen con su categoría. Por ejemplo, podemos definir un Source con categoría "Negocios" para loger cualquier evento que sea información y que tenga como destino un Trace Listener en particular. -Filters: Los filtros son justamente eso, filtros, nos permiten discriminar eventos por prioridad, por categoría o directamente no logear nada, también podemos definir nuestro filtros. En definitiva la cosa queda así Filter -> Source -> TraceListener (formateando con un Formatter) Comencemos con un ejemplo simple Con EntLib 3 instalada hacemos click derecho sobre nuestro App.Config y vemos la siguiente opción Haciendo click en "Edit Enterprise Library Configuration" nos aparece la siguiente ventana Gracias a el excelente trabajo que han echo los muchachos de Microsoft Practices no será necesario lidiar con ningún archivo de configuración, podemos configurar cualquier elemento de la EntLib. Para agregar LAB a la configuración hacemos botón derecho sobre el nodo que dice el path del archivo y seleccionamos New -> Logging Application Block Acto seguido nos queda así Vemos que EntLib creó por nosotros una configuración por defecto, vamos a ver que significa cada cosa. Debajo del nodo "Logging Application Block" vemos la carpeta Filters vacía, es decir, no hay filtros definidos, cuando esto es así se logea todo sin filtrar nada. A continuación se encuentra la carpeta "Category Source" que son los source que nosotros creamos, hay uno creado por defecto que se llama "General" y tiene debajo un nodo que dice "Formatted Evento Log Trace Listener" este es el listener que utilizará esta categoría para logear y lo podemos ver definido dentro de la carpeta "Trace Listeners". Al final hay una carpeta "Formatters" que contiene un único elemento que es un formater de texto. Hay una carpeta más llamada "Special Sources" que es igual a la de Category Source pero con unos eventos predefinidos, la idea es que atrapa los eventos independientemente de la categoría, un poco más sencillo pero también menos potente, vemos además que tiene el nodo "Logging Errors & Warnings" con una referencia al mismo Trace Listener que la categoría General. Nos paramos con el puntero sobre la caegoría general y persionamos F4, nos aparece la siguiente ventana El name es el nombre con el que vamos a referirnos a la categoría y el source level indica que tipo de eventos va a tener en cuentra esta categoría más allá de que un evento se indicado con esta categoría deberá ser del source level indicado y superior (es decir el source level es information se tiene en cuentra information, error, etc) para ser logeado, por defecto se encuentra en "All" con lo cual cualquier evento que tenga indicada la categoría General será logeado independientemente del source level. Vamos hasta el nodo "Trace Listeners" y seleccionamos el "Formatted Event Log Trace Listener" y presionamos F4, nos aparece la siguiente ventana Lo que tenemos que hacer es borrar la palabra "Application" de "Log" porque si nuestro Windows está en castellano no va a funcionar, sino ponemos nada por defecto grabará el el event log de aplicación. Y Listo, ya está configurado para escribir en el log de windows en la entrada de aplicación de aplicación. Vamos al código. Habiendo agregado la referencia a logging application block en el proyecto colocamos el using Microsoft.Practices.EnterpriseLibrary.Logging al principio del código escribimos: Logger.Write(new LogEntry("hola mundo", "General",2, 2, TraceEventType.Error, "Prueba", null)); Listo. Corremos la aplicación y vamos rápidamente el log de windows y albricias La seguimos en la próxima tengo que trabajar un poco.

1 comentario:

Anónimo dijo...

Que tal, esta super interesante lo de los blocks app, pero hizo segun yo lo que describes y me marca el siguiente error al momento de escribir en el log: mi correo ahuatzi_andres@hotmail.com..........System.Configuration.ConfigurationErrorsException was unhandled
Message="The configuration section for Logging cannot be found in the configuration source."
Source="Microsoft.Practices.EnterpriseLibrary.Logging"
BareMessage="The configuration section for Logging cannot be found in the configuration source."
Line=0
StackTrace:
at Microsoft.Practices.EnterpriseLibrary.Logging.LogWriterStructureHolderCustomFactory.ValidateLoggingSettings(LoggingSettings loggingSettings)
at Microsoft.Practices.EnterpriseLibrary.Logging.LogWriterStructureHolderCustomFactory.CreateObject(IBuilderContext context, String name, IConfigurationSource configurationSource, ConfigurationReflectionCache reflectionCache)
at Microsoft.Practices.EnterpriseLibrary.Logging.LogWriterCustomFactory.CreateObject(IBuilderContext context, String name, IConfigurationSource configurationSource, ConfigurationReflectionCache reflectionCache)
at Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder.ConfiguredObjectStrategy.BuildUp(IBuilderContext context, Type t, Object existing, String id)
at Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(IBuilderContext context, Type typeToBuild, Object existing, String idToBuild)
at Microsoft.Practices.ObjectBuilder.SingletonStrategy.BuildUp(IBuilderContext context, Type typeToBuild, Object existing, String idToBuild)
at Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(IBuilderContext context, Type typeToBuild, Object existing, String idToBuild)
at Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder.ConfigurationNameMappingStrategy.BuildUp(IBuilderContext context, Type t, Object existing, String id)
at Microsoft.Practices.ObjectBuilder.BuilderBase`1.DoBuildUp(IReadWriteLocator locator, Type typeToBuild, String idToBuild, Object existing, PolicyList[] transientPolicies)
at Microsoft.Practices.ObjectBuilder.BuilderBase`1.BuildUp(IReadWriteLocator locator, Type typeToBuild, String idToBuild, Object existing, PolicyList[] transientPolicies)
at Microsoft.Practices.ObjectBuilder.BuilderBase`1.BuildUp[TTypeToBuild](IReadWriteLocator locator, String idToBuild, Object existing, PolicyList[] transientPolicies)
at Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder.EnterpriseLibraryFactory.BuildUp[T](IReadWriteLocator locator, IConfigurationSource configurationSource)
at Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder.EnterpriseLibraryFactory.BuildUp[T](IConfigurationSource configurationSource)
at Microsoft.Practices.EnterpriseLibrary.Logging.LogWriterFactory.Create()
at Microsoft.Practices.EnterpriseLibrary.Logging.Logger.get_Writer()
at Microsoft.Practices.EnterpriseLibrary.Logging.Logger.Write(LogEntry log)
at WindowsApplication2.Form1..ctor() in C:\WindowsApplication2\WindowsApplication2\Form1.cs:line 17
at WindowsApplication2.Program.Main() in C:\WindowsApplication2\WindowsApplication2\Program.cs:line 17
at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()