Una traza es una descripcin real de la evolucin temporal de un sistema. Para generar esta descripcin se debe disponer de acceso a los parmetros del sistema ue sean relevantes. La generacin de trazas se !a realizado generalmente por medio de librer"as o unidades dedicadas a ese e#ecto$ tal como L%G4J. &n ocasiones$ estas unidades deben combinarse con el cdigo del programa o aplicacin a monitorizar ' en otras puede !acerse por medio de una conexin al canal de comunicacin o al sistema !ard(are. Tanto de una #orma como de otra$ la traza deber mantener la correspondiente co!erencia ' !omogeneidad en su creacin. La monitorizacin del sistema no de)a de ser un m*todo ue pueda inter#erir en el #uncionamiento del mismo ' en algunos casos si no se presta la debida atencin a su tratamiento$ esta inter#erencia de la observacin puede resultar problemtica$ dado ue la generacin de la traza ' el almacenado en un arc!ivo es una tarea ms en el sistema. &n primer lugar$ se comentan los problemas ue acarrea insertar instrucciones System.out.println dispersas por todo el cdigo de una aplicacin. A continuacin$ se detalla una con#iguracin m"nima ' apropiada del pauete Log4). 1.1 Comprensin de la situacin La existencia de trazas es importante para a'udar en la tarea de depuracin de una aplicacin. &scribir cdigo para generar trazas +log, es primitivo ' de mu' ba)o nivel. -o se recomienda en absoluto cdigo del estilo. System.out.println(El valor de la variable es: + valor) &sta #orma de generar trazas plantear los siguientes problemas. La salida por pantalla no se puede con#igurar. -o se puede desactivar la salida para clases previamente seleccionadas. -o se puede elegir sacar slo un subcon)unto de mensa)es. La salida por pantalla puede degradar seriamente el rendimiento en algunos servidores. La generacin de trazas tiene varios usos$ pero el ms importante es #acilitar la depuracin. Trazas bien colocadas en una aplicacin proporcionan a los desarrolladores el contexto detallado en ue se !a producido un #allo. Por otra parte$ las pruebas aseguran la calidad ' #iabilidad necesarias. -o se debe con#undir la generacin de trazas con las pruebas. Ambas son complementarias. /uando se usan adecuadamente$ las trazas son una !erramienta esencial para un pro'ecto.
0ubdireccin General de 1esarrollo$ Tecnolog"a e 2n#raestructuras. Pgina. 3 Anexo Generacin Trazas con Log4J 1.2 Log4j 1.2.1 Configuracin u!o a"#cua"o "# Log4$ &l pauete Log4) o#rece m4ltiples opciones$ como guardar trazas en #ormato 56L$ en bases de datos$ etc. 1etallar todas ' cmo !acerlo no est en el mbito de este documento. Para ello$ consultar la documentacin disponible en !ttp.77logging.apac!e.org7log4)7docs7documentation.!tml Gracias al dise8o de Log4)$ es posible de#inir prioridades para las trazas. 1e esta #orma$ desde el #ic!ero de con#iguracin se puede controlar el detalle de las trazas ue se van a generar. Las prioridades prede#inidas o#recidas son +ordenadas de ma'or a menor detalle,. DE%&G ' IN(O ' )ARN ' ERROR ' (ATAL Por completitud$ se8alaremos ue tambi*n existen las prioridades ALL ' %99. Aunue no se recomienda !acerlo$ se pueden de#inir nuevas prioridades. &stableceremos los siguientes criterios para la explotacin de los niveles de log desde nuestro cdigo. DE%&G. 6ensa)es de depuracin. 0e puede utilizar para mostrar el valor de variables. 0on mensa)es ue deber"a entender ' ser tratados alguien ue conoce el cdigo de la aplicacin. 2ncorporarn in#ormacin sobre c!ec:points ue a'udarn a seguir el curso de la e)ecucin del algoritmo implementado. &ste nivel de log deber encontrarse des!abilitado en produccin para evitar ue ralentice su e)ecucin. IN(O. 6ensa)es de in#ormacin. 0e utilizan para anunciar el progreso en el #lu)o de la aplicacin. 6arcarn inicios ' #inalizacin de bloues de actividades con cmputos de tiempo empleado en realizarlas. ;e#le)arn con#irmacin de las acciones de persistencia en base de datos$ marcando el inicio ' #in de las transacciones. 2ncorporarn en la traza la sentencia 0<L lanzada '7o parmetros de los procedimientos almacenados. La actividad del pool de conexiones tambi*n deber"a re#le)arse !aciendo uso de este nivel de trazas. )ARN. 6ensa)es de advertencia$ usado dentro de la aplicacin para dar aviso de excepciones esperadas ' ue nuestro cdigo sepa tratarlas para evitar ue la aplicacin se interrumpa. Las trazas debern re#le)ar los datos de la operacin ue !a generado la excepcin$ valores del #ic!ero de con#iguracin con la ue se est realizando la operacin. ERROR. 6ensa)es de error$ para dar aviso de errores inesperados ue no lleguen a detener o a#ectar la e)ecucin de la aplicacin. La traza deber recoger la misma in#ormacin ue la descrita para el caso anterior ' adems a8adir un indicador de prioridad ue a'ude a comprender el alcance del error. o NI*EL 1 = el proceso puede #inalizar correctamente a pesar de las inconsistencias producidas. La propia aplicacin podr recuperarse de este evento ' subsanarse el error con posterioridad mediante alg4n proceso de actualizacin o sincronizacin. o NI*EL 2 = se desconoce si la #inalizacin del proceso puede darse por vlida debido a ue no es posible conocer el alcance de la inconsistencia ' solventarse de modo automatizado. 0ubdireccin General de 1esarrollo$ Tecnolog"a e 2n#raestructuras. Pgina. > Anexo Generacin Trazas con Log4J o NI*EL + = el carcter del error es severo ' ser"a recomendable la intervencin de un administrador para evaluar la situacin. &s aconse)able el acuse de tal traza v"a correo electrnico al administrador del sistema. La direccin de correo del administrador #igurar en el #ic!ero de con#iguracin de la aplicacin.
(ATAL. 6ensa)es de error$ para dar aviso de errores inesperados ue a#ectan o detienen la e)ecucin de la aplicacin. 1eber implementarse un sistema de alerta al administrador mediante correo electrnico ue avise con carcter de urgencia la ca"da del sistema ' de)ar noti#icacin del env"o en el #ic!ero de log. A lo largo de cualuier desarrollo iremos utilizando los distintos niveles de log para recoger in#ormacin del estado ' #uncionamiento de nuestra aplicacin. Llegar un momento en ue los mensa)es de menor importancia 'a no sern necesarios$ en ese caso podemos #iltrar auellos ue no se necesiten +este es el tipo de #iltro ms bsico,$ de esa manera todos los mensa)es de igual o ma'or nivel van a loguearse mientras ue los mensa)es de menor nivel sern ignorados. Por e)emplo$ si se especi#ica 1&?UG$ los mensa)es a volcar en el log van a ser del tipo 1&?UG$ 2-9%$ @A;-$ &;;%; ' 9ATAL. 0i se especi#ica @A;-$ slo se mostraran auellos del tipo de @A;-$ &;;%; ' 9ATAL. &n de#initiva se !ace log de todos los niveles ue estn por deba)o del nivel especi#icado en el #ic!ero de con#iguracin. I,-ORTANTE. La in#ormacin de la traza SI deber recoger in#ormacin temporal exacta sobre el momento en ue se produzca ' el punto donde se !a generado ' mensa)e descriptivo para poder luego proceder a su anlisis de manera e#ectiva. La in#ormacin de la traza NO deber recoger in#ormacin susceptible de ser protegida como pueda ser. datos de identi#icacin$ valores de acceso a bases de datos o sistemas a)enos$ datos personales$ etcA La con#iguracin de Log4) se !ace completamente con #ic!eros. Ba' tres posibilidades. 9ic!ero de propiedades. 9ic!ero 56L &stableciendo propiedades desde el propio programa en tiempo de e)ecucin. A continuacin se muestran los valores adecuados para los parmetros de con#iguracin del log4). Lo !abitual ser"a utilizar el #ic!ero log4).properties para su con#iguracin debe ir en el directorio 7@&?C2-97classes de la aplicacin @eb +o en su de#ecto en directorio incluido en el /LA00PATB de la aplicacin,$ sin embargo en este caso la con#iguracin va a ser tratada de #orma dinmica del #ic!ero de con#iguracin xml de la aplicacin +ver cap"tulo de #ic!eros de con#iguracin,$ al encontrarse a!" centralizada todos los parmetros de con#iguracin de la aplicacin en un 4nico #ic!ero. 0ubdireccin General de 1esarrollo$ Tecnolog"a e 2n#raestructuras. Pgina. D Anexo Generacin Trazas con Log4J 0e indicar en los valores de la con#iguracin el directorio sobre el ue se crearn los # ic/#ro! incr#0#n1a2#! "# 1ra3a!. &ste directorio ue contiene los #ic!eros de log debe encontrarse #uera del servidor de aplicaciones$ en cualuiera de las muinas ue #orman el cluster para permitir realizar operaciones de borrado mediante procesos batc! ' evitar bloueos o desbordamientos dentro del contexto del servidor de aplicaciones. 0e aplicar el siguiente criterio temporal a la !ora de tratar los #ic!eros de log. &xistir un #ic!ero de log "iario$ la primera traza generada del d"a proceder a la creacin del #ic!ero con la siguiente sintaxis. /usr//log/nombrelog _ddmmaaaa.log 0iendo nombrelog tambi*n recogido del #ic!ero de con#iguracin de la aplicacin. &n caso de ue el #ic!ero de log diario crezca por encima de 3EEF? se proceder a realizar un bac:up de #ic!eros diarios !asta 4$ acorde con los parmetros de con#iguracin de log4) indicados a continuacin. <log id=log desc="coniguraci!n de log"#"$ <param id="pat%" value="/usr//log"&$ <param id="ile" value="nombrelog"&$ <'(( active appenders (($ <param id="log"#.root)ogger" value="*arn+ stdout+ ile"&$ <'(( console appender setup (($ <paramid="log"#.appender.stdout" value="org.apac%e.log"#.,onsole-ppender"&$ <param id="log"#.appender.stdout.layout" value="org.apac%e.log"#..attern)ayout"&$ <param id="log"#.appender.stdout.layout.,onversion.attern" value="/0p 1/t2 (/3: /)) 4 /m/n" desc="s%o* ilename and line number"&$ <'(( ile appender setup (($ <param id="log"#.appender.ile" value="org.apac%e.log"#.5olling3ile-ppender"&$ <param id="log"#.appender.ile.3ile" value="67log.ile8"&$ <param id="log"#.appender.ile.9a:3ileSi;e" value="<==>?"&$ <param id="log"#.appender.ile.9a:?ac@upAnde:" value=""" desc="support our bac@up"&$ <param id="log"#.appender.ile.layout" value="org.apac%e.log"#..attern)ayout"&$ <param id="log"#.appender.ile.layout.,onversion.attern" value="/d7BB:mm:ss.SSS8 /(0p 1/t2 ( /mCn"&$ <'D( notiication mail (($ <param id="log"#.notiication.enabled" value="true" desc="notiicaciones de error"&$ <param id="log"#.notiication.mail" value="adminEserver.es" desc="administrator mail"&$ <&log$ 1.2.2 E$#042o "# u!o import org.apac%e.log"#.)oggerF public class Gemo 7 static )ogger log = )ogger.get)ogger(Gemo.class.getHame())F
public static void main(String12 args) 7 log.ino("Anicio de programa...")F try 7 && Givision por cero int : = 0F int y = I= & (0 ( :)F 8 catc% (-rit%meticE:ception e) 7 0ubdireccin General de 1esarrollo$ Tecnolog"a e 2n#raestructuras. Pgina. 4 Anexo Generacin Trazas con Log4J log.error("Se %a producido un error"+ e)F 8 8 8 /on la con#iguracin proporcionada por el #ic!ero log4).properties mostrado arriba$ el resultado ser ue tanto por pantalla como en el #ic!ero indicado se obtendr la siguiente traza. I==0(="(IJ <K:0K:0<+0LJ AH3M 1Gemo2 ( <Anicio de programa...$ I==0(="(IJ <K:0K:0<+0NK E55M5 1Gemo2 ( <Se %a producido un error$ #ava.lang.-rit%meticE:ception: & by ;ero at Gemo.main(Gemo.#ava:<<) /ambiando la prioridad desde el #ic!ero de con#iguracin$ se puede controlar la traza a mostrar. &ste cambio debe poder realizarse sin necesidad de reiniciar el servidor de aplicaciones$ esto es posible !acerlo con la a'uda de 1om/on#igurator 'a incluido en Log4). 1.2.+ 5#rra0i#n1a! "# !o4or1# a Log4$ /omo venta)a adicional a las 'a enumeradas$ existen varias !erramientas +comerciales ' openCsource, ue toman como entrada las trazas generadas por Log4) ' las representan gr#icamente. &n este apartado se describen brevemente dos !erramientas openCsource. /!ainsa( ' Lumbermill. Chainsaw (http://sourceforge.net/projects/logui) 1isponible a partir de la versin 3.> de Log4). /aptura mensa)es de trazas enviados por T/P72P. Puede representar gr#icamente trazas generadas en #ormato 56L. 0ubdireccin General de 1esarrollo$ Tecnolog"a e 2n#raestructuras. Pgina. G Anexo Generacin Trazas con Log4J Lumbermill (http://sourceforge.net/projects/lumbermill) /aptura mensa)es de trazas enviados por T/P72P. &s un poco ms atractivo gr#icamente ue /!ainsa( ' permite #iltrar trazas en la muina cliente. -o soporta trazas en #ormato 56L . 0ubdireccin General de 1esarrollo$ Tecnolog"a e 2n#raestructuras. Pgina. H