log4j-1-2-15-shortmanual

59
Monitorización de aplicaciones 1.2.15 Emmerson Miranda SCJP 1.5 SCWCD J2EE 1.5 Blog : http://emmersonmiranda.blogspot.com/ Licensed under Creative Commons Attribution 3

Upload: sharoninia

Post on 24-Jul-2015

35 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: log4j-1-2-15-shortmanual

Monitorización de aplicaciones

1.2.15

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

Licensed under Creative Commons Attribution 3

Page 2: log4j-1-2-15-shortmanual

Guión

PARTE TEÓRICA

1. Introducción 1. System.out.println

2. vista global

2. Características

3. Componentes1. Diagrama

2. Prioridades

3. Appenders

4. Loggers

5. Layouts

4. Configuración e Inicialización

5. Optimización

6. Monitor de mensajes

Page 3: log4j-1-2-15-shortmanual

Log4j 1.2.15

Parte teórica

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

Page 4: log4j-1-2-15-shortmanual

1.- Introducción

Page 5: log4j-1-2-15-shortmanual

Introducción

Siempre que se desarrolla una aplicación es necesario monitorizar su comportamiento a fin de ver o detectar sus posibles anomalías.

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

Page 6: log4j-1-2-15-shortmanual

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 difícil encontrar un error dentro de toda la aplicación.

Al utilizar System.out.println no estamos granulando la aplicación para la depuración.

No se puede deshabilitar los mensajes

system.out.println - ¿Por qué no?

Page 7: log4j-1-2-15-shortmanual

Log4J es un componente que nos permite hacer trazas de nuestras aplicaciones.

Se configura fácilmente mediante un fichero de configuración llamado: log4j.properties ó Log4j.xml

A nivel de código es muy poco intrusivo.

Introducción

Page 9: log4j-1-2-15-shortmanual

2.- Características

Page 10: log4j-1-2-15-shortmanual

Diferentes niveles de traza por prioridad.

Filtros según categoría.

Redirección de las trazas a diferentes destinos A ficheros A consola A Base de datos Colas JMS, etc.

Formatos de visualización personalizados.

Configuración por ficheros.

Características

Page 11: log4j-1-2-15-shortmanual

Permite activar o desactivar las trazas en tiempo de ejecución, sin modificar código fuente.

Tiene herencia entre loggers

Se puede utilizar en diferentes tipos de aplicaciones Web Escritorio

Soporta múltiples plataformas (Java, .Net)

Configurable en tiempo de ejecución

Características

Page 12: log4j-1-2-15-shortmanual

3.- Componentes

Page 13: log4j-1-2-15-shortmanual

Componentes

Aplicación Logger

Nivel / Prioridad

Appender

Filter Layout

1..*

Page 14: log4j-1-2-15-shortmanual

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 ejecución cómo estos mensajes son formateados y donde salen.

Componentes

Page 15: log4j-1-2-15-shortmanual

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 código y con diferentes niveles de prioridad.

De acuerdo al nivel de prioridad establecido para el mensaje y al nivel configurado en el fichero de configuración, estos mensajes se podrán mostrar o no.

El nivel de prioridad por defecto es INFO, lo cual quiere decir que todos los mensajes escritos con esta se mostrarán automáticamente

Prioridades

Page 16: log4j-1-2-15-shortmanual

Niveles / Prioridades

FATAL: Muestra los mensajes de situaciones que probablemente harán abortar la aplicación.

ERROR: Muestra los mensajes de errores que no son deseados pero que no interrumpirán la aplicación.

WARN: Muestra los mensajes de contextos peligrosos para la aplicación, o ciertas operaciones de uso no recomendado.

INFO: Muestra los mensajes de información sobre la ejecución de la aplicación, o sus eventos importantes.

DEBUG: Muestra los mensajes para depurar la aplicación. (Utilizado en tiempo de desarrollo)

ALL: Muestra todos los mensajes OFF: Desactiva todos los mensajes.

Page 17: log4j-1-2-15-shortmanual

Matriz de prioridades

Page 18: log4j-1-2-15-shortmanual

Una de las características 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.

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

Appenders

Page 19: log4j-1-2-15-shortmanual

Cada petición de logging para un logger dado será enviada a todos los appenders de ese logger así como a los appenders más altos en la jerarquía.

Es decir , los appender son heredados aditivamente desde la jerarquía de loggers.

Es posible cambiar este comportamiento por defecto estableciendo la propiedad “additivity” a false.

Aditividad de los Appenders

Page 20: log4j-1-2-15-shortmanual

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.

Reglas de aditividad

Page 21: log4j-1-2-15-shortmanual

Appenders

Page 22: log4j-1-2-15-shortmanual

Appenders

Nombre Descripción

JDBCAppender Permite registrar los mensajes en una base de datos.

JMSAppender Envía los mensajes a colas JMS del tipo Topic, siendo transmitidos como un mensaje JMS del tipo ObjectMessage.

NTEventLogAppender Añade mensajes en el sistema de eventos de log de Windows NT.

NullAppender Simplemente existe, nunca imprime los mensajes en ninguna unidad.

SMTPAppender Envía e-mails cuando ocurre un evento de registro, normalmente en errores o errores fatales.

Page 23: log4j-1-2-15-shortmanual

Appenders

Nombre Descripción

ConsoleAppender 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 tamaño especificado.

Page 24: log4j-1-2-15-shortmanual

Ejemplo: Configuración 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>

Page 25: log4j-1-2-15-shortmanual

Son el núcleo principal del proceso de registro de mensajes.

Sus distintos tipos de niveles han sido tratados en el apartado de prioridades.

Loggers

Page 26: log4j-1-2-15-shortmanual

El espacio de todas las posibles sentencias de log esta categorizado según a algún criterio elegido por el programador.

Esto nos lleva a elegir categoría 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 mayúsculas y

siguen la siguiente regla de nombrado:

Loggers

Page 27: log4j-1-2-15-shortmanual

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 jerarquía de loggers. Es excepcional en dos cosas: Siempre existe No puede ser recuperado por nombre.

Loggers

Page 28: log4j-1-2-15-shortmanual

Los loggers solo muestran mensajes que son más grandes o igual a su prioridad.

Si la prioridad de registro de un logger no esta especificado en el fichero de configuración, 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

Loggers

Page 29: log4j-1-2-15-shortmanual

Logger logger = Logger.getRootLogger();

La práctica más habitual para instanciar un logger es declararlo como estático 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 configuración o con la siguiente línea de código: logger.setLevel((Level)Level.WARN);

Obtener un logger por código

Page 30: log4j-1-2-15-shortmanual

Logger log = Logger.getRootLogger(); log.debug(mensaje) .- Escribe el mensaje cuando el nivel de traza mínimo

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.

Impresión de trazas

Page 31: log4j-1-2-15-shortmanual

Loggers

Nombre Descripción

Category Clase deprecada y reemplazada por la subclase Logger; en otras palabras un Logger es una Category.

Logger Clase principal del paquete log4j, proporciona operaciones para registrar los mensajes, excepto la configuración.

RootCategory Deprecada, conocida así mismo como “root”, la “root category” no puede ser recuperada por nombre.

RootLogger Ubicada en el límite de la jerarquía de la clase “Logger”, a este logger no se le puede asignar un nivel “null”.

Page 32: log4j-1-2-15-shortmanual

Ejemplo: Configuración 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>

Page 33: log4j-1-2-15-shortmanual

Todo Appender necesita tener asociado un Layout (formato de salida de los mensajes)

Layouts

Page 34: log4j-1-2-15-shortmanual

Layouts

Nombre Descripción

HTMLLayout Formatea la salida de los mensajes en forma de tablas HTML, utilizando la codificación UTF8 o UTF16

PatternLayout Formatea la salida de los mensajes según el patrón de conversión especificado en una cadena de texto.

SimpleLayout Imprime directamente el mensaje con el prefijo relacionado al nivel de prioridad seguido de un guión “-”..

XMLLayout Imprime los mensajes como una serie de etiquetas XML log4j:event definido en el fichero log4j.dtd

Page 35: log4j-1-2-15-shortmanual

Formatea la salida de los mensajes según el patrón de conversión especificado en una cadena de texto.

El patrón de conversión esta compuesto por literales de texto(cualquier literal) y expresiones de formato llamadas "Conversion specifiers“

Cada especificación de conversión empieza con el carácter "%" seguidos opcionalmente de modificadores de formato y conversión de caracteres

PatternLayout

Por ejemplo, definido un patrón de conversión: "%-5p [%t]: %m%n" (en el fichero de configuración)

Escritura de la traza en código JAVALogger log = Logger.getLogger(MiClase.class);log.debug("Message 1");log.warn("Message 2");

Salida formateada según el patrón especificadoDEBUG [main]: Message 1WARN [main]: Message 2

Page 36: log4j-1-2-15-shortmanual

4.- Configuración e inicialización

Page 37: log4j-1-2-15-shortmanual

El entorno log4j es completamente configurable programáticamente

Sin embargo , es mucho más flexible configurar log4j usando archivos de configuración

Log4J se puede configurar mediante dos tipos de ficheros Fichero de propiedades.- log4j.properties Fichero XML .- log4j.xml

Configuración

Page 38: log4j-1-2-15-shortmanual

Los ficheros de configuración de propiedades son mucho mas complicados de entender y no tienen un orden claro.

Las configuraciones XML son más fáciles de entender por diferentes programadores, además que es más sencillo darle mantenimiento al archivo XML.

Log4j.properties

Page 39: log4j-1-2-15-shortmanual

Ejemplo: Log4j.properties

# initialise root logger with level DEBUG and call it BLAHlog4j.rootLogger=DEBUG, BLAH

# add a ConsoleAppender to the logger BLAHlog4j.appender.BLAH=org.apache.log4j.ConsoleAppender

# set set that layout to be SimpleLayoutlog4j.appender.BLAH.layout=org.apache.log4j.SimpleLayout

Page 40: log4j-1-2-15-shortmanual

Su estructura viene definida en el fichero descriptivo log4j.dtd

Se suele colocar en un directorio accesible para la aplicación.

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

Log4j.xml

Page 41: log4j-1-2-15-shortmanual

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>

Page 42: log4j-1-2-15-shortmanual

Log4J se suele inicializar con la siguiente linea: DOMConfigurator.configure("log4j.xml") PropertyConfigurator.configure("log4j.lcf")

Para las aplicaciones web la línea de código anterior suele estar dentro de un servlet que se inicializa al cargar la aplicación. Normalmente el nombre del fichero que contiene la configuración se

encuentra como un parámetro de dicho servlet.

Inicialización

Page 43: log4j-1-2-15-shortmanual

Ejemplo: Inicialización 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>

Page 44: log4j-1-2-15-shortmanual

Ejemplo: Inicialización servletpackage 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); } }…}

Page 45: log4j-1-2-15-shortmanual

5.- Optimización

Page 46: log4j-1-2-15-shortmanual

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 excepción 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 configuración de root sino más bien la configuración de un o unos paquetes en especial.

Optimización

Page 47: log4j-1-2-15-shortmanual

Cuando los logs son apagados el coste de los registros se limita únicamente a la invocación del método.

No esta demás decir que la invocación del método esconde el coste de la construcción del parámetro (mensaje). Operador + StringBuilder

Desactivar las trazas

Page 48: log4j-1-2-15-shortmanual

Se deben evitar lineas de código como por ejemplo:

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

Para evitar los costos de la construcción de los parámetros es recomendable verificar si el nivel esta activado.

Desactivar las trazas

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

Page 49: log4j-1-2-15-shortmanual

Los layouts internamente al formatear el texto también involucran penalizaciones.

Una de las formas mas sencillas y rápidas incluso que el System.out.println es utilizar el SimpleLayout.

El coste de los layouts

Page 50: log4j-1-2-15-shortmanual

Dado que los appenders escriben en toda su jerarquía por defecto, supone tantos costes de más, como layouts y destinos de escritura tenga; por eso es recomendable desactivar la aditividad.

Aditividad de los appenders

Page 51: log4j-1-2-15-shortmanual

Chainsaw

6.- Monitor de mensajes

Page 52: log4j-1-2-15-shortmanual

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 línea de comandos java -classpath log4j-1.2.15.jar org.apache.log4j.chainsaw.Main

También esta disponible desde el Java Web Start http://logging.apache.org/chainsaw/download.html

Chainsaw

Page 53: log4j-1-2-15-shortmanual

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>

Page 54: log4j-1-2-15-shortmanual

Chainsaw incorporado en log4j.1.2.15.jar

Page 55: log4j-1-2-15-shortmanual

Chainsaw desde el Java Web Start

Page 56: log4j-1-2-15-shortmanual

NO! Una técnica 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 información con otras herramientas especializadas.

Chainsaw, ¿el único?

Page 57: log4j-1-2-15-shortmanual

Conclusiones

Page 58: log4j-1-2-15-shortmanual

CONCLUSIONES

Usando la jerarquía 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 configuración pudiendo registrar los mensajes en distintos tipos de fuentes de manera transparente sin tener que recompilar nuestro código.

Ayuda a mejorar el rendimiento y el seguimiento de errores de las aplicaciones.

Page 59: log4j-1-2-15-shortmanual

- FIN -Licensed under Creative Commons Attribution 3

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