Sie sind auf Seite 1von 59

Monitorizacin de aplicaciones

1.2.15
Licensed under Creative Commons Attribution 3

Emmerson Miranda SCJP 1.5 SCWCD J2EE 1.5 Blog : http://emmersonmiranda.blogspot.com/

Guin
PARTE TERICA Introduccin
1. 2.

1.

System.out.println vista global

2. 3.
1. 2. 3. 4. 5.

Caractersticas Componentes
Diagrama Prioridades Appenders Loggers Layouts

4. 5. 6.

Configuracin e Inicializacin Optimizacin Monitor de mensajes

Log4j 1.2.15
Parte terica

Emmerson Miranda SCJP 1.5 SCWCD J2EE 1.5 Blog : http://emmersonmiranda.blogspot.com/

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

system.out.println - Por qu no?


Consume recursos en el sistema operativo ya que las llamadas a System.out.println se agregan a un archivo Log que controla el servidor de aplicaciones. Es difcil encontrar un error dentro de toda la aplicacin. Al utilizar System.out.println no estamos granulando la aplicacin para la depuracin. No se puede deshabilitar los mensajes

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.

Otros frameworks de logging


Commons logging de Apache JSR47 (comparativa con log4j) Sun Logging API SLF4J Log4net (versin para .Net) Enterprise Library Application Blocks (Logging application block) para .Net

2.- Caractersticas

Caractersticas
Diferentes niveles de traza por prioridad. Filtros segn categora. Redireccin de las trazas a diferentes destinos

A ficheros A consola A Base de datos Colas JMS, etc.

Formatos de visualizacin personalizados. Configuracin por ficheros.

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

Soporta mltiples plataformas (Java, .Net) Configurable en tiempo de ejecucin

3.- Componentes

Componentes

Aplicacin 1..*

Componentes
Log4j tiene tres componentes principales :

loggers appenders layouts .

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:

La consola Ficheros Sockets Eventos de Windows Unix Syslog JMS y otros.

Tambin se pueden implementar Appenders propios implementando la interfaz Appender para crear nuestros propios sistemas de registro de mensajes.

Aditividad de los Appenders


Cada peticin de logging para un logger dado ser enviada a todos los appenders de ese logger as como a los appenders ms altos en la jerarqua. Es decir , los appender son heredados aditivamente desde la jerarqua de loggers. Es posible cambiar este comportamiento por defecto estableciendo la propiedad additivity a false.

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.

NTEventLogAppender NullAppender SMTPAppender

Appenders
Nombre ConsoleAppender Descripcin Registran los mensajes usando System.out o System.err usando el formato especificado por el usuario.

FileAppender

Registra los mensajes en un fichero

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.

Ejemplo: Configuracin de Appenders


<appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.SimpleLayout"/> </appender> <appender name="FichHibernate" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="c://HibernateTraining.log" /> <param name="DatePattern" value="'.'yyyy-MM-dd" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}:%L] %m%n" /> </layout> </appender> <appender name="file" class="org.apache.log4j.FileAppender"> <param name="File" value="debug.log"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[Time: %d] [Thread: %t] [Level: %p]%m%n" /> </layout> </appender>

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

Obtener un logger por cdigo


Logger logger = Logger.getRootLogger(); La prctica ms habitual para instanciar un logger es declararlo como esttico asociado a la clase de la cual queremos hacer las trazas. private static Logger log = Logger.getLogger(NuestraClase.class); Para establecer la prioridad de un logger se lo puede hacer mediante el fichero de configuracin o con la siguiente lnea de cdigo: logger.setLevel((Level)Level.WARN);

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.

Ejemplo: Configuracin de loggers


<root> <priority value ="debug" /> <appender-ref ref="console" /> </root> <logger name=edu.training.hibernate.domain.MyClass"> <level value="info"/> <appender-ref ref=" ConsoleAppender" /> </logger> <logger name=edu.training.hibernate" additivity="false"> <level value=debug" /> <appender-ref ref=" FichHibernate" /> </logger> <logger name=edu.training" additivity="false"> <level value=ALL" /> <appender-ref ref=file" /> </logger>

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

4.- Configuracin e inicializacin

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

Fichero de propiedades.- log4j.properties Fichero XML .- log4j.xml

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.

Ejemplo: Inicializacin servlet


<servlet> <servlet-name>log4j-init</servlet-name> <servlet-class>edu.training.jee.Log4jInit</servlet-class> <init-param> <param-name>log4j-init-file</param-name> <param-value>WEB-INF/classes/log4j.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>

Ejemplo: Inicializacin servlet


package edu.training.jee; import ...; ... public class Log4jInit extends HttpServlet { public void init() { String prefix = getServletContext().getRealPath("/"); String file = getInitParameter("log4j-init-file"); if(file != null) { //PropertyConfigurator.configure(prefix+file); DOMConfigurator.configure(prefix+file); } } }

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.

Desactivar las trazas


Cuando los logs son apagados el coste de los registros se limita nicamente a la invocacin del mtodo. No esta dems decir que la invocacin del mtodo esconde el coste de la construccin del parmetro (mensaje).

Operador + StringBuilder

Desactivar las trazas


Se deben evitar lineas de cdigo como por ejemplo:

logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));

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])); }

El coste de los layouts


Los layouts internamente al formatear el texto tambin involucran penalizaciones. Una de las formas mas sencillas y rpidas incluso que el System.out.println es utilizar el SimpleLayout.

Aditividad de los appenders


Dado que los appenders escriben en toda su jerarqua por defecto, supone tantos costes de ms, como layouts y destinos de escritura tenga; por eso es recomendable desactivar la aditividad.

6.- Monitor de mensajes


Chainsaw

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

java -classpath log4j-1.2.15.jar org.apache.log4j.chainsaw.Main

Tambin esta disponible desde el Java Web Start

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 incorporado en log4j.1.2.15.jar

Chainsaw desde el Java Web Start

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.

- FIN Licensed under Creative Commons Attribution 3


Emmerson Miranda SCJP 1.5 SCWCD J2EE 1.5 Blog : http://emmersonmiranda.blogspot.com/

Das könnte Ihnen auch gefallen