SlideShare una empresa de Scribd logo
Monitorización de aplicaciones       1.2.15Licensed under Creative Commons Attribution 3Emmerson Miranda  SCJP 1.5SCWCD  J2EE 1.5Blog : http://emmersonmiranda.blogspot.com/
GuiónPARTE TEÓRICAIntroducción System.out.printlnvista globalCaracterísticasComponentesDiagramaPrioridadesAppendersLoggersLayoutsConfiguración e InicializaciónOptimizaciónMonitor de mensajes
Log4j 1.2.15Parte teóricaEmmerson Miranda  SCJP 1.5SCWCD  J2EE 1.5Blog : http://emmersonmiranda.blogspot.com/
1.- Introducción
IntroducciónSiempre 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
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 mensajessystem.out.println - ¿Por qué no?
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.xmlA nivel de código es muy poco intrusivo.Introducción
Commons loggingde ApacheJSR47  (comparativa con log4j)Sun Logging APISLF4JLog4net (versión para .Net)Enterprise Library Application Blocks (Loggingapplication block) para .NetOtros frameworks de logging
2.- Características
Diferentes niveles de traza por prioridad. Filtros según categoría. Redirección de las trazas a diferentes destinosA ficherosA consolaA Base de datosColas JMS, etc. Formatos de visualización personalizados. Configuración por ficheros.Características
Permite activar o desactivar las trazas en tiempo de ejecución, sin modificar código fuente.Tiene herencia entre loggersSe puede utilizar en diferentes tipos de aplicacionesWebEscritorioSoporta múltiples plataformas (Java, .Net)Configurable en tiempo de ejecuciónCaracterísticas
3.- Componentes
ComponentesNivel / PrioridadAplicaciónLoggerAppender1..*FilterLayout
Log4j tiene tres componentes principales : loggers appenderslayouts . 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
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áticamentePrioridades
Niveles / PrioridadesFATAL: 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 mensajesOFF: Desactiva todos los mensajes.
Matriz de prioridades
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 consolaFicherosSocketsEventos de WindowsUnix SyslogJMS y otros.También se pueden implementar Appenders propios implementando  la interfaz  Appender para crear nuestros propios sistemas de registro de mensajes.Appenders
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
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
Appenders
Appenders
Appenders
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>
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
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
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
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.fooLoggers
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
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
Loggers
Ejemplo: Configuración de loggers<root>         <priority value ="debug" />         <appender-ref ref="console" /> </root><logger name=“edu.training.hibernate.domain.MyClass">         <levelvalue="info"/>         <appender-refref=" ConsoleAppender" /></logger><logger name=“edu.training.hibernate" additivity="false">         <levelvalue=“debug" />         <appender-refref=" FichHibernate" /> </logger><logger name=“edu.training" additivity="false">         <levelvalue=“ALL" />         <appender-refref=“file" /> </logger>
Todo Appender necesita tener asociado un Layout (formato de salida de los  mensajes)Layouts
Layouts
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 caracteresPatternLayoutPor 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
4.- Configuración e inicialización
El entorno log4j es completamente configurable programáticamente Sin embargo , es mucho más flexible configurar log4j usando archivos de configuraciónLog4J se puede configurar mediante dos tipos de ficherosFichero de propiedades.- log4j.propertiesFichero XML .- log4j.xmlConfiguración
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
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
Su estructura viene definida en el fichero descriptivo log4j.dtdSe suele colocar en un directorio accesible para la aplicación.Normalmente en caso de las aplicaciones web  dentro de la carpeta  WEB-INF/classesEn algunas versiones de Tomcat hay que especificarlo en los scripts de arranque.CATALINA_OPTS="-Dlog4j.configuration=log4j.xml“http://wiki.apache.org/logging-log4j/Log4jXmlFormatLog4j.xml
Ejemplo: Log4j.xml<?xmlversion="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appendername="console" class="org.apache.log4j.ConsoleAppender">         <paramname="Target" value="System.out"/>          <layoutclass="org.apache.log4j.PatternLayout">                    <paramname="ConversionPattern" value="%-5p %c{1} - %m%n"/>          </layout> </appender> <root>          <priorityvalue ="debug" />          <appender-refref="console" /> </root> </log4j:configuration>
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
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>
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);  } }…}
5.- Optimización
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
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 +StringBuilderDesactivar las trazas
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 trazasif(logger.isDebugEnabled() ){logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));}
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
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
Chainsaw6.- Monitor de mensajes
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 comandosjava -classpath log4j-1.2.15.jar org.apache.log4j.chainsaw.MainTambién esta disponible desde el Java Web Starthttp://logging.apache.org/chainsaw/download.htmlChainsaw
Chainsaw <appendername="FILE" class="org.apache.log4j.RollingFileAppender">     <errorHandlerclass="org.apache.log4j.helpers.OnlyOnceErrorHandler"/>     <paramname="File" value="HolaMundoHibernate.log"/>     <param name="Threshold" value="DEBUG"/>     <param name="Append" value="false"/>     <param name="MaxFileSize" value="5000KB"/>     <param name="MaxBackupIndex" value="50"/>     <layoutclass="org.apache.log4j.xml.XMLLayout" />    </appender><logger name="org.hibernate.loader">       <levelvalue="DEBUG"/>       <appender-refref="FILE"/></logger>
Chainsaw incorporado en log4j.1.2.15.jar
Chainsaw desde el Java Web Start
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 linuxCualquier 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?
           Conclusiones
ConclusionesUsando 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.
- FIN -Licensed under Creative Commons Attribution 3Emmerson Miranda  SCJP 1.5SCWCD  J2EE 1.5Blog : http://emmersonmiranda.blogspot.com/

Más contenido relacionado

PPTX
Unidad III procedimientos
PDF
4035426 ejercicios-resueltos-en-pascal
PPTX
macros Lenguaje ensamblador
PPTX
Estructura .COM
PDF
PPTX
Assembler
PDF
Clase10 ejemplos asm con tasm y tlink
PPTX
2 poo u1 2 Hola mundo
Unidad III procedimientos
4035426 ejercicios-resueltos-en-pascal
macros Lenguaje ensamblador
Estructura .COM
Assembler
Clase10 ejemplos asm con tasm y tlink
2 poo u1 2 Hola mundo

La actualidad más candente (15)

PDF
Manual Instalación JLex & CUP
PDF
NASM
PPTX
Unidad 3
PDF
Introduccion al assembler
PPTX
Armando cevallos.doc
PDF
UNIDAD 2 PROGRAMACIÓN BASICA
PDF
Analizador Léxico y Sintáctico para Compilador que Invierte Cadenas utilizand...
PDF
Tutorial de prolog
DOCX
Unidad3 130504222102-phpapp02
PPTX
2 poo u1 1 Introduccion
PPTX
Estructurabsicadeunprogramaendevc 140605195118-phpapp02(2)
PDF
Curso De IniciacióN Al Lenguaje C
PPTX
Estructura básica para C++
PDF
Equipo 6 comparaciones
PPTX
Presentacion de la_estructura_de_c++
Manual Instalación JLex & CUP
NASM
Unidad 3
Introduccion al assembler
Armando cevallos.doc
UNIDAD 2 PROGRAMACIÓN BASICA
Analizador Léxico y Sintáctico para Compilador que Invierte Cadenas utilizand...
Tutorial de prolog
Unidad3 130504222102-phpapp02
2 poo u1 1 Introduccion
Estructurabsicadeunprogramaendevc 140605195118-phpapp02(2)
Curso De IniciacióN Al Lenguaje C
Estructura básica para C++
Equipo 6 comparaciones
Presentacion de la_estructura_de_c++
Publicidad

Destacado (6)

PPT
Log4 J
PDF
Manual struts2-espanol
PPT
JEE 5 - EJB3
PPTX
WSO2 API Manager - Accessing SOAP Service
PPTX
Hibernate 3.2 short manual
PPSX
Persistencia de objetos con Hibernate
Log4 J
Manual struts2-espanol
JEE 5 - EJB3
WSO2 API Manager - Accessing SOAP Service
Hibernate 3.2 short manual
Persistencia de objetos con Hibernate
Publicidad

Similar a Log4j 1.2.15 Short Manual (20)

PDF
Log en Aplicaciones Java y JavaEE
PPTX
12 Logging
PDF
Jyoc java-cap21 jse avanzado
PDF
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...
PPTX
Fundamentos de Java / 15 consejos prácticos sobre Java que cambiarán la for...
PDF
Java fundamentos -15 consejos practicos open saturday 2018
PDF
OCP, JSE 6 Programmer (1z0-851) - Guia practica 3 de 7(ap-is)
PDF
Desarrollo proyectos-informaticos-con-java
PDF
Desarrollo proyectos-informaticos-con-java
PDF
investigacion unidad tres componentes y librerias
PDF
Curso javabasico
PDF
Curso Java Basico
PDF
Paralela10
PDF
Libro javacontapa
PDF
Libro javacontapa
PDF
Manualde javabasico
PDF
Java basico
PDF
Manualde javabasico (1)
Log en Aplicaciones Java y JavaEE
12 Logging
Jyoc java-cap21 jse avanzado
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...
Fundamentos de Java / 15 consejos prácticos sobre Java que cambiarán la for...
Java fundamentos -15 consejos practicos open saturday 2018
OCP, JSE 6 Programmer (1z0-851) - Guia practica 3 de 7(ap-is)
Desarrollo proyectos-informaticos-con-java
Desarrollo proyectos-informaticos-con-java
investigacion unidad tres componentes y librerias
Curso javabasico
Curso Java Basico
Paralela10
Libro javacontapa
Libro javacontapa
Manualde javabasico
Java basico
Manualde javabasico (1)

Más de Emmerson Miranda (11)

PPTX
WSO2 DSS - JENKINS
PPTX
WSO2 DSS - Calling stored procedures with cursors
PPTX
WSO2 DSS - Create a Data service
PPTX
WSO2 ESB - Acceso a base de datos
PPTX
WS02 ESB Service Chaining
PPTX
WSO2 REST API Example
PPTX
WSO2 Transformer Proxy
PPSX
Prototipado de pantallas para toma de requisitos
PPTX
Json short manual
PPTX
Modelado de aplicaciones en UML con EA
PPT
Arquitectura Mashup Con SilverLight 2
WSO2 DSS - JENKINS
WSO2 DSS - Calling stored procedures with cursors
WSO2 DSS - Create a Data service
WSO2 ESB - Acceso a base de datos
WS02 ESB Service Chaining
WSO2 REST API Example
WSO2 Transformer Proxy
Prototipado de pantallas para toma de requisitos
Json short manual
Modelado de aplicaciones en UML con EA
Arquitectura Mashup Con SilverLight 2

Último (20)

DOCX
Trabajo colaborativo Grupo #2.docxmkkkkkkl
PDF
Aristoteles-y-su-forma-de-entender-el-conocimiento-y-las-personas.pdf
DOCX
Zarate Quispe Alex aldayir aplicaciones de internet .docx
PPTX
Introduccion a servidores de Aplicaciones (1).pptx
DOCX
Las nuevas tecnologías en la salud - enfermería técnica.
PDF
diagrama de pareto.pdf valerie giraldo diaz
PDF
5.1 Pinch y Bijker en libro Actos, actores y artefactos de Bunch Thomas (coor...
PDF
Maste clas de estructura metálica y arquitectura
PPT
introduccion a las_web en el 2025_mejoras.ppt
PDF
Estrategia de apoyo tecnología miguel angel solis
PPTX
REDES INFORMATICAS REDES INFORMATICAS.pptx
PPTX
historia_web de la creacion de un navegador_presentacion.pptx
PPTX
RAP01 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
PDF
Conceptos básicos de programación tecnología.pdf
PPT
Que son las redes de computadores y sus partes
DOCX
Trabajo colaborativo Grupo #2.docxmmuhhlk
PDF
Influencia-del-uso-de-redes-sociales.pdf
PPTX
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
PDF
La electricidad y la electrónica .pdf n
PDF
SAP Transportation Management para LSP, TM140 Col18
Trabajo colaborativo Grupo #2.docxmkkkkkkl
Aristoteles-y-su-forma-de-entender-el-conocimiento-y-las-personas.pdf
Zarate Quispe Alex aldayir aplicaciones de internet .docx
Introduccion a servidores de Aplicaciones (1).pptx
Las nuevas tecnologías en la salud - enfermería técnica.
diagrama de pareto.pdf valerie giraldo diaz
5.1 Pinch y Bijker en libro Actos, actores y artefactos de Bunch Thomas (coor...
Maste clas de estructura metálica y arquitectura
introduccion a las_web en el 2025_mejoras.ppt
Estrategia de apoyo tecnología miguel angel solis
REDES INFORMATICAS REDES INFORMATICAS.pptx
historia_web de la creacion de un navegador_presentacion.pptx
RAP01 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
Conceptos básicos de programación tecnología.pdf
Que son las redes de computadores y sus partes
Trabajo colaborativo Grupo #2.docxmmuhhlk
Influencia-del-uso-de-redes-sociales.pdf
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
La electricidad y la electrónica .pdf n
SAP Transportation Management para LSP, TM140 Col18

Log4j 1.2.15 Short Manual

  • 1. Monitorización de aplicaciones 1.2.15Licensed under Creative Commons Attribution 3Emmerson Miranda SCJP 1.5SCWCD J2EE 1.5Blog : http://emmersonmiranda.blogspot.com/
  • 2. GuiónPARTE TEÓRICAIntroducción System.out.printlnvista globalCaracterísticasComponentesDiagramaPrioridadesAppendersLoggersLayoutsConfiguración e InicializaciónOptimizaciónMonitor de mensajes
  • 3. Log4j 1.2.15Parte teóricaEmmerson Miranda SCJP 1.5SCWCD J2EE 1.5Blog : http://emmersonmiranda.blogspot.com/
  • 5. IntroducciónSiempre 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 mensajessystem.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.xmlA nivel de código es muy poco intrusivo.Introducción
  • 8. Commons loggingde ApacheJSR47 (comparativa con log4j)Sun Logging APISLF4JLog4net (versión para .Net)Enterprise Library Application Blocks (Loggingapplication block) para .NetOtros frameworks de logging
  • 10. Diferentes niveles de traza por prioridad. Filtros según categoría. Redirección de las trazas a diferentes destinosA ficherosA consolaA Base de datosColas 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 loggersSe puede utilizar en diferentes tipos de aplicacionesWebEscritorioSoporta múltiples plataformas (Java, .Net)Configurable en tiempo de ejecuciónCaracterísticas
  • 14. Log4j tiene tres componentes principales : loggers appenderslayouts . 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áticamentePrioridades
  • 16. Niveles / PrioridadesFATAL: 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 mensajesOFF: 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 consolaFicherosSocketsEventos de WindowsUnix SyslogJMS 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
  • 24. 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>
  • 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.fooLoggers
  • 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
  • 32. Ejemplo: Configuración de loggers<root> <priority value ="debug" /> <appender-ref ref="console" /> </root><logger name=“edu.training.hibernate.domain.MyClass"> <levelvalue="info"/> <appender-refref=" ConsoleAppender" /></logger><logger name=“edu.training.hibernate" additivity="false"> <levelvalue=“debug" /> <appender-refref=" FichHibernate" /> </logger><logger name=“edu.training" additivity="false"> <levelvalue=“ALL" /> <appender-refref=“file" /> </logger>
  • 33. Todo Appender necesita tener asociado un Layout (formato de salida de los mensajes)Layouts
  • 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 caracteresPatternLayoutPor 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
  • 36. 4.- Configuración e inicialización
  • 37. El entorno log4j es completamente configurable programáticamente Sin embargo , es mucho más flexible configurar log4j usando archivos de configuraciónLog4J se puede configurar mediante dos tipos de ficherosFichero de propiedades.- log4j.propertiesFichero XML .- log4j.xmlConfiguració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 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
  • 40. Su estructura viene definida en el fichero descriptivo log4j.dtdSe suele colocar en un directorio accesible para la aplicación.Normalmente en caso de las aplicaciones web dentro de la carpeta WEB-INF/classesEn algunas versiones de Tomcat hay que especificarlo en los scripts de arranque.CATALINA_OPTS="-Dlog4j.configuration=log4j.xml“http://wiki.apache.org/logging-log4j/Log4jXmlFormatLog4j.xml
  • 41. Ejemplo: Log4j.xml<?xmlversion="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appendername="console" class="org.apache.log4j.ConsoleAppender"> <paramname="Target" value="System.out"/> <layoutclass="org.apache.log4j.PatternLayout"> <paramname="ConversionPattern" value="%-5p %c{1} - %m%n"/> </layout> </appender> <root> <priorityvalue ="debug" /> <appender-refref="console" /> </root> </log4j:configuration>
  • 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
  • 43. 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>
  • 44. 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); } }…}
  • 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 +StringBuilderDesactivar 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 trazasif(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 comandosjava -classpath log4j-1.2.15.jar org.apache.log4j.chainsaw.MainTambién esta disponible desde el Java Web Starthttp://logging.apache.org/chainsaw/download.htmlChainsaw
  • 53. Chainsaw <appendername="FILE" class="org.apache.log4j.RollingFileAppender"> <errorHandlerclass="org.apache.log4j.helpers.OnlyOnceErrorHandler"/> <paramname="File" value="HolaMundoHibernate.log"/> <param name="Threshold" value="DEBUG"/> <param name="Append" value="false"/> <param name="MaxFileSize" value="5000KB"/> <param name="MaxBackupIndex" value="50"/> <layoutclass="org.apache.log4j.xml.XMLLayout" /> </appender><logger name="org.hibernate.loader"> <levelvalue="DEBUG"/> <appender-refref="FILE"/></logger>
  • 54. Chainsaw incorporado en log4j.1.2.15.jar
  • 55. Chainsaw desde el Java Web Start
  • 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 linuxCualquier 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. ConclusionesUsando 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 3Emmerson Miranda SCJP 1.5SCWCD J2EE 1.5Blog : http://emmersonmiranda.blogspot.com/