Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Monitorización de aplicaciones con Log4j
1. Monitorización 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/
2. Guión PARTE TEÓRICA Introducción System.out.println vista global Características Componentes Diagrama Prioridades Appenders Loggers Layouts Configuración e Inicialización Optimización Monitor de mensajes
3. Log4j 1.2.15 Parte teórica Emmerson Miranda SCJP 1.5 SCWCD J2EE 1.5 Blog : http://emmersonmiranda.blogspot.com/
5. 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
6. 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?
7. 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
8. Commons loggingde Apache JSR47 (comparativa con log4j) Sun Logging API SLF4J Log4net (versión para .Net) Enterprise Library Application Blocks (Loggingapplication block) para .Net Otros frameworks de logging
10. 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
11. 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
14. 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
15. 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
16. 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.
18. 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
19. 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
20. 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 additivityflag 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 additivityflag puesto a true por defecto. Reglas de aditividad
25. 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
26. 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
27. 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
28. 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
29. 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. privatestatic 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
30. 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
35. 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 "Conversionspecifiers“ 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 JAVA Logger log = Logger.getLogger(MiClase.class); log.debug("Message 1"); log.warn("Message 2"); Salida formateada según el patrón especificado DEBUG [main]: Message 1 WARN [main]: Message 2
37. 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
38. 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
39. 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
40. 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
42. 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
46. 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
47. 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
48. Se deben evitar lineas de código como por ejemplo: logger.debug("Entrynumber: " + 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])); }
49. 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
50. 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
52. 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
56. 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?
57. Conclusiones
58. 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.
59. - FIN - Licensed under Creative Commons Attribution 3 Emmerson Miranda SCJP 1.5 SCWCD J2EE 1.5 Blog : http://emmersonmiranda.blogspot.com/