Beruflich Dokumente
Kultur Dokumente
1.2.15
Licensed under Creative Commons Attribution 3
Guin
PARTE TERICA Introduccin
1. 2.
1.
2. 3.
1. 2. 3. 4. 5.
Caractersticas Componentes
Diagrama Prioridades Appenders Loggers Layouts
4. 5. 6.
Log4j 1.2.15
Parte terica
1.- Introduccin
Introduccin
Siempre que se desarrolla una aplicacin es necesario monitorizar su comportamiento a fin de ver o detectar sus posibles anomalas. Normalmente las monitorizaciones se suelen hacer desde una consola del servidor web o desde un archivo de log. Durante una temporada para realizar estas tareas se hacia utilizando el comando system.out.println
Introduccin
Log4J es un componente que nos permite hacer trazas de nuestras aplicaciones. Se configura fcilmente mediante un fichero de configuracin llamado: log4j.properties Log4j.xml A nivel de cdigo es muy poco intrusivo.
2.- Caractersticas
Caractersticas
Diferentes niveles de traza por prioridad. Filtros segn categora. Redireccin de las trazas a diferentes destinos
Caractersticas
Permite activar o desactivar las trazas en tiempo de ejecucin, sin modificar cdigo fuente. Tiene herencia entre loggers Se puede utilizar en diferentes tipos de aplicaciones
Web Escritorio
3.- Componentes
Componentes
Aplicacin 1..*
Componentes
Log4j tiene tres componentes principales :
Estos tres funcionan juntos para habilitar a los programadores sacar mensajes de log, de acuerdo al tipo de mensaje y al nivel, y controlar en tiempo de ejecucin cmo estos mensajes son formateados y donde salen.
Prioridades
Cada mensaje que se escribe se hace con un nivel de prioridad. Cuando se escriben trazas en nuestras aplicaciones, normalmente se hacen en diferentes partes del cdigo y con diferentes niveles de prioridad. De acuerdo al nivel de prioridad establecido para el mensaje y al nivel configurado en el fichero de configuracin, estos mensajes se podrn mostrar o no. El nivel de prioridad por defecto es INFO, lo cual quiere decir que todos los mensajes escritos con esta se mostrarn automticamente
Niveles / Prioridades
FATAL: Muestra los mensajes de situaciones que probablemente harn abortar la aplicacin. ERROR: Muestra los mensajes de errores que no son deseados pero que no interrumpirn la aplicacin. WARN: Muestra los mensajes de contextos peligrosos para la aplicacin, o ciertas operaciones de uso no recomendado. INFO: Muestra los mensajes de informacin sobre la ejecucin de la aplicacin, o sus eventos importantes. DEBUG: Muestra los mensajes para depurar la aplicacin. (Utilizado en tiempo de desarrollo) ALL: Muestra todos los mensajes OFF: Desactiva todos los mensajes.
Matriz de prioridades
Appenders
Una de las caractersticas que hace grande a Log4J es su capacidad para poder escribir mensajes en distintos tipos de destinos como por ejemplo:
Tambin se pueden implementar Appenders propios implementando la interfaz Appender para crear nuestros propios sistemas de registro de mensajes.
Reglas de aditividad
Por ejemplo: La salida de una sentencia de logger C ir a los appenders de C y a los de sus antecesores. Sin embargo , si un antecesor de logger C, digamos P , tiene la additivity flag a falso , entonces la salida de C ser dirigida a los appenders de C y a los de sus antecesores hasta llegar a P incluido , pero no ira a los antecesores de P. Los loggers tienen el additivity flag puesto a true por defecto.
Appenders
Appenders
Nombre JDBCAppender JMSAppender Descripcin Permite registrar los mensajes en una base de datos. Enva los mensajes a colas JMS del tipo Topic, siendo transmitidos como un mensaje JMS del tipo ObjectMessage. Aade mensajes en el sistema de eventos de log de Windows NT. Simplemente existe, nunca imprime los mensajes en ninguna unidad. Enva e-mails cuando ocurre un evento de registro, normalmente en errores o errores fatales.
Appenders
Nombre ConsoleAppender Descripcin Registran los mensajes usando System.out o System.err usando el formato especificado por el usuario.
FileAppender
DailyRollingFileAppender Registra los mensajes en un fichero que va rotando a diario. RollingFileAppender Registra los mensajes en un fichero que rota dado un tamao especificado.
Loggers
Son el ncleo principal del proceso de registro de mensajes. Sus distintos tipos de niveles han sido tratados en el apartado de prioridades.
Loggers
El espacio de todas las posibles sentencias de log esta categorizado segn a algn criterio elegido por el programador. Esto nos lleva a elegir categora como el concepto central del paquete. Sin embargo desde el log4j 1.2 , la clase Logger ha reemplazado a la clase Category. Por lo tanto a partir de ah hablamos de Loggers. Los Loggers son entidades con nombre . Los nombres de los Loggers son sensibles a la maysculas y siguen la siguiente regla de nombrado:
Loggers
Un logger se dice que es un antecesor de otro logger si su nombre seguido por un punto es un prefijo dentro del nombre del otro logger. Por ejemplo ,el logger llamado com.foo es un padre del logger llamado com.foo.bar. De forma similar , java es un padre de java.util y el antecesor de java.util.Vector. El logger root reside en el top de la jerarqua de loggers. Es excepcional en dos cosas: Siempre existe No puede ser recuperado por nombre.
Loggers
Los loggers solo muestran mensajes que son ms grandes o igual a su prioridad. Si la prioridad de registro de un logger no esta especificado en el fichero de configuracin, este lo hereda de su logger inmediatamente superior (padre) y as sucesivamente hasta heredar del "root logger".
As que si un logger es creado por ejemplo para el paquete com.foo.bar no tiene un nivel configurado, entonces heredar el nivel configurado para el paquete com.foo
Impresin de trazas
Logger log = Logger.getRootLogger();
log.debug(mensaje) .- Escribe el mensaje cuando el nivel de traza mnimo especificado es DEBUG. log.error(mensaje).- parecido a lo anterior. log.fatal(mensaje).- parecido a lo anterior. log.info(mensaje).- parecido a lo anterior. log.warn(mensaje).- parecido a lo anterior.
Loggers
Nombre Category Logger Descripcin Clase deprecada y reemplazada por la subclase Logger; en otras palabras un Logger es una Category. Clase principal del paquete log4j, proporciona operaciones para registrar los mensajes, excepto la configuracin.
RootCategory Deprecada, conocida as mismo como root, la root category no puede ser recuperada por nombre. RootLogger Ubicada en el lmite de la jerarqua de la clase Logger, a este logger no se le puede asignar un nivel null.
Layouts
Todo Appender necesita tener asociado un Layout (formato de salida de los mensajes)
Layouts
Nombre HTMLLayout Descripcin Formatea la salida de los mensajes en forma de tablas HTML, utilizando la codificacin UTF8 o UTF16
PatternLayout Formatea la salida de los mensajes segn el patrn de conversin especificado en una cadena de texto. SimpleLayout XMLLayout Imprime directamente el mensaje con el prefijo relacionado al nivel de prioridad seguido de un guin -.. Imprime los mensajes como una serie de etiquetas XML log4j:event definido en el fichero log4j.dtd
PatternLayout
Formatea la salida de los mensajes segn el patrn de conversin especificado en una cadena de texto.
Por ejemplo, definido un patrn de conversin: "%-5p [%t]: %m%n" El patrn de conversin esta compuesto por literales de (en el fichero de configuracin)
texto(cualquier literal) y expresiones de formato llamadas Escritura de la traza "Conversion specifiers en cdigo JAVA
Logger log = Logger.getLogger(MiClase.class); log.debug("Message 1"); Cada especificacin de conversin empieza con el carcter "%" log.warn("Message 2");
seguidos opcionalmente de modificadores de formato y conversin Salida formateada segn el patrn especificado de caracteres
DEBUG [main]: Message 1 WARN [main]: Message 2
Configuracin
El entorno log4j es completamente configurable programticamente Sin embargo , es mucho ms flexible configurar log4j usando archivos de configuracin Log4J se puede configurar mediante dos tipos de ficheros
Log4j.properties
Los ficheros de configuracin de propiedades son mucho mas complicados de entender y no tienen un orden claro. Las configuraciones XML son ms fciles de entender por diferentes programadores, adems que es ms sencillo darle mantenimiento al archivo XML.
Ejemplo: Log4j.properties
# initialise root logger with level DEBUG and call it BLAH log4j.rootLogger=DEBUG, BLAH # add a ConsoleAppender to the logger BLAH log4j.appender.BLAH=org.apache.log4j.ConsoleAppender # set set that layout to be SimpleLayout log4j.appender.BLAH.layout=org.apache.log4j.SimpleLayout
Log4j.xml
Su estructura viene definida en el fichero descriptivo log4j.dtd Se suele colocar en un directorio accesible para la aplicacin. Normalmente en caso de las aplicaciones web dentro de la carpeta WEB-INF/classes En algunas versiones de Tomcat hay que especificarlo en los scripts de arranque. CATALINA_OPTS="-Dlog4j.configuration=log4j.xml
http://wiki.apache.org/logging-log4j/Log4jXmlFormat
Ejemplo: Log4j.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <param name="Target" value="System.out"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-5p %c{1} - %m%n"/> </layout> </appender> <root> <priority value ="debug" /> <appender-ref ref="console" /> </root> </log4j:configuration>
Inicializacin
Log4J se suele inicializar con la siguiente linea:
DOMConfigurator.configure("log4j.xml") PropertyConfigurator.configure("log4j.lcf")
Para las aplicaciones web la lnea de cdigo anterior suele estar dentro de un servlet que se inicializa al cargar la aplicacin.
Normalmente el nombre del fichero que contiene la configuracin se encuentra como un parmetro de dicho servlet.
5.- Optimizacin
Optimizacin
Un apartado importante en el uso de las trazas es como utilizarlas cuando se producen errores/excepciones. No siempre hay que escribir las trazas de excepciones a nivel de error, ya que en algunos casos no interesa que se visualicen. En caso de escribir componentes que posteriormente utilicen otras personas, convendr relanzar la excepcin y escribir la traza a nivel de DEBUG o INFO dependiendo de si el programador ser el propio usuario de la clase o si un tercero quien la utilice. Se recomienda que en los proyecto no debe estar la configuracin de root sino ms bien la configuracin de un o unos paquetes en especial.
Operador + StringBuilder
Para evitar los costos de la construccin de los parmetros es recomendable verificar si el nivel esta activado.
if(logger.isDebugEnabled() ){ logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i])); }
Chainsaw
Log4J trae consigo un monitor de mensajes denominado chainsaw, hecho con Java, el cual permite ver el contenido de aquellos ficheros de log en formato XML. Viene dentro log4j-1.2.xx.jar y se puede ejecutar desde lnea de comandos
http://logging.apache.org/chainsaw/download.html
Chainsaw
<appender name="FILE" class="org.apache.log4j.RollingFileAppender"> <errorHandler class="org.apache.log4j.helpers.OnlyOnceErrorHandler"/> <param name="File" value="HolaMundoHibernate.log"/> <param name="Threshold" value="DEBUG"/> <param name="Append" value="false"/> <param name="MaxFileSize" value="5000KB"/> <param name="MaxBackupIndex" value="50"/> <layout class="org.apache.log4j.xml.XMLLayout" /> </appender> <logger name="org.hibernate.loader"> <level value="DEBUG"/> <appender-ref ref="FILE"/> </logger>
Chainsaw, el nico?
NO!
Una tcnica consiste siempre en re direccionar a un fichero de texto, y luego este se puede inspeccionar con herramientas como:
tail.- en linux Cualquier editor de texto, como por ejemplo vi, ultraedit, notepad++
La otra mandar los mensajes a bases de datos, para luego explotar la informacin con otras herramientas especializadas.
Conclusiones
CONCLUSIONES
Usando la jerarqua de los loggers se pueden controlar granular mente que mensajes deseamos mostrar. Ayuda a reducir el volumen de mensajes registrados. Log4J ofrece distintos tipos de configuracin pudiendo registrar los mensajes en distintos tipos de fuentes de manera transparente sin tener que recompilar nuestro cdigo. Ayuda a mejorar el rendimiento y el seguimiento de errores de las aplicaciones.