Log4j 1.2.15 Short Manual

18.142 visualizaciones

Publicado el

Short manual of Log4j, Log4net similar

Publicado en: Tecnología, Educación
4 comentarios
10 recomendaciones
Estadísticas
Notas
Sin descargas
Visualizaciones
Visualizaciones totales
18.142
En SlideShare
0
De insertados
0
Número de insertados
6.689
Acciones
Compartido
0
Descargas
673
Comentarios
4
Recomendaciones
10
Insertados 0
No insertados

No hay notas en la diapositiva.

Log4j 1.2.15 Short Manual

  1. 1. Monitorización de aplicaciones<br /> 1.2.15<br />Licensed under Creative Commons Attribution 3<br />Emmerson Miranda <br />SCJP 1.5<br />SCWCD J2EE 1.5<br />Blog : http://emmersonmiranda.blogspot.com/ <br />
  2. 2. Guión<br />PARTE TEÓRICA<br />Introducción <br />System.out.println<br />vista global<br />Características<br />Componentes<br />Diagrama<br />Prioridades<br />Appenders<br />Loggers<br />Layouts<br />Configuración e Inicialización<br />Optimización<br />Monitor de mensajes<br />
  3. 3. Log4j 1.2.15<br />Parte teórica<br />Emmerson Miranda <br />SCJP 1.5<br />SCWCD J2EE 1.5<br />Blog : http://emmersonmiranda.blogspot.com/<br />
  4. 4. 1.- Introducción<br />
  5. 5. Introducción<br />Siempre que se desarrolla una aplicación es necesario monitorizar su comportamiento a fin de ver o detectar sus posibles anomalías.<br />Normalmente las monitorizaciones se suelen hacer desde una consola del servidor web o desde un archivo de log.<br />Durante una temporada para realizar estas tareas se hacia utilizando el comando system.out.println<br />
  6. 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. <br />Es difícil encontrar un error dentro de toda la aplicación. <br />Al utilizar System.out.println no estamos granulando la aplicación para la depuración. <br />No se puede deshabilitar los mensajes<br />system.out.println - ¿Por qué no?<br />
  7. 7. Log4J es un componente que nos permite hacer trazas de nuestras aplicaciones.<br />Se configura fácilmente mediante un fichero de configuración llamado: <br />log4j.properties ó<br />Log4j.xml<br />A nivel de código es muy poco intrusivo.<br />Introducción<br />
  8. 8. Commons loggingde Apache<br />JSR47 (comparativa con log4j)<br />Sun Logging API<br />SLF4J<br />Log4net (versión para .Net)<br />Enterprise Library Application Blocks (Loggingapplication block) para .Net<br />Otros frameworks de logging<br />
  9. 9. 2.- Características<br />
  10. 10. Diferentes niveles de traza por prioridad. <br />Filtros según categoría. <br />Redirección de las trazas a diferentes destinos<br />A ficheros<br />A consola<br />A Base de datos<br />Colas JMS, etc. <br />Formatos de visualización personalizados. <br />Configuración por ficheros.<br />Características<br />
  11. 11. Permite activar o desactivar las trazas en tiempo de ejecución, sin modificar código fuente.<br />Tiene herencia entre loggers<br />Se puede utilizar en diferentes tipos de aplicaciones<br />Web<br />Escritorio<br />Soporta múltiples plataformas (Java, .Net)<br />Configurable en tiempo de ejecución<br />Características<br />
  12. 12. 3.- Componentes<br />
  13. 13. Componentes<br />Nivel / Prioridad<br />Aplicación<br />Logger<br />Appender<br />1..*<br />Filter<br />Layout<br />
  14. 14. Log4j tiene tres componentes principales : <br />loggers <br />appenders<br />layouts . <br />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.<br />Componentes<br />
  15. 15. Cada mensaje que se escribe se hace con un nivel de prioridad.<br />Cuando se escriben trazas en nuestras aplicaciones, normalmente se hacen en diferentes partes del código y con diferentes niveles de prioridad.<br />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.<br />El nivel de prioridad por defecto es INFO, lo cual quiere decir que todos los mensajes escritos con esta se mostrarán automáticamente<br />Prioridades<br />
  16. 16. Niveles / Prioridades<br />FATAL: Muestra los mensajes de situaciones que probablemente harán abortar la aplicación. <br />ERROR: Muestra los mensajes de errores que no son deseados pero que no interrumpirán la aplicación. <br />WARN: Muestra los mensajes de contextos peligrosos para la aplicación, o ciertas operaciones de uso no recomendado. <br />INFO: Muestra los mensajes de información sobre la ejecución de la aplicación, o sus eventos importantes.<br />DEBUG: Muestra los mensajes para depurar la aplicación. (Utilizado en tiempo de desarrollo) <br />ALL: Muestra todos los mensajes<br />OFF: Desactiva todos los mensajes.<br />
  17. 17. Matriz de prioridades<br />
  18. 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:<br />La consola<br />Ficheros<br />Sockets<br />Eventos de Windows<br />Unix Syslog<br />JMS y otros.<br />También se pueden implementar Appenders propios implementando la interfaz Appender para crear nuestros propios sistemas de registro de mensajes.<br />Appenders<br />
  19. 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.<br />Es posible cambiar este comportamiento por defecto estableciendo la propiedad “additivity” a false.<br />Aditividad de los Appenders<br />
  20. 20. Por ejemplo: La salida de una sentencia de logger C irá a los appenders de C y a los de sus antecesores.<br />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.<br />Los loggers tienen el additivityflag puesto a true por defecto.<br />Reglas de aditividad<br />
  21. 21. Appenders<br />
  22. 22. Appenders<br />
  23. 23. Appenders<br />
  24. 24. Ejemplo: Configuración de Appenders<br />&lt;appender name=&quot;ConsoleAppender&quot; class=&quot;org.apache.log4j.ConsoleAppender&quot;&gt;<br /> &lt;layout class=&quot;org.apache.log4j.SimpleLayout&quot;/&gt;<br />&lt;/appender&gt;<br />&lt;appender name=&quot;FichHibernate&quot; class=&quot;org.apache.log4j.DailyRollingFileAppender&quot;&gt;<br /> &lt;param name=&quot;File&quot; value=&quot;c://HibernateTraining.log&quot; /&gt;<br /> &lt;param name=&quot;DatePattern&quot; value=&quot;&apos;.&apos;yyyy-MM-dd&quot; /&gt;<br /> &lt;layout class=&quot;org.apache.log4j.PatternLayout&quot;&gt;<br /> &lt;param name=&quot;ConversionPattern&quot; value=&quot;%d{ABSOLUTE} %-5p [%c{1}:%L] %m%n&quot; /&gt;<br /> &lt;/layout&gt;<br />&lt;/appender&gt;<br />&lt;appender name=&quot;file&quot; class=&quot;org.apache.log4j.FileAppender&quot;&gt;<br /> &lt;param name=&quot;File&quot; value=&quot;debug.log&quot;/&gt;<br /> &lt;layout class=&quot;org.apache.log4j.PatternLayout&quot;&gt;<br /> &lt;param name=&quot;ConversionPattern&quot; value=&quot;[Time: %d] [Thread: %t] [Level: %p]%m%n&quot; /&gt;<br /> &lt;/layout&gt;<br />&lt;/appender&gt;<br />
  25. 25. Son el núcleo principal del proceso de registro de mensajes.<br />Sus distintos tipos de niveles han sido tratados en el apartado de prioridades.<br />Loggers<br />
  26. 26. El espacio de todas las posibles sentencias de log esta categorizado según a algún criterio elegido por el programador. <br />Esto nos lleva a elegir categoría como el concepto central del paquete.<br />Sin embargo desde el log4j 1.2 , la clase Logger ha reemplazado a la clase Category.<br />Por lo tanto a partir de ahí hablamos de Loggers.<br />Los Loggers son entidades con nombre . <br />Los nombres de los Loggers son sensibles a la mayúsculas y siguen la siguiente regla de nombrado:<br />Loggers<br />
  27. 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.<br />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”. <br />El logger root reside en el top de la jerarquía de loggers. Es excepcional en dos cosas:<br />Siempre existe <br />No puede ser recuperado por nombre. <br />Loggers<br />
  28. 28. Los loggers solo muestran mensajes que son más grandes o igual a su prioridad.<br />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 &quot;root logger&quot;.<br />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<br />Loggers<br />
  29. 29. Logger logger = Logger.getRootLogger();<br />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.<br />privatestatic Logger log = Logger.getLogger(NuestraClase.class);<br />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:<br />logger.setLevel((Level)Level.WARN);<br />Obtener un logger por código<br />
  30. 30. Logger log = Logger.getRootLogger();<br />log.debug(mensaje) .- Escribe el mensaje cuando el nivel de traza mínimo especificado es DEBUG.<br />log.error(mensaje).- parecido a lo anterior.<br />log.fatal(mensaje).- parecido a lo anterior.<br />log.info(mensaje).- parecido a lo anterior.<br />log.warn(mensaje).- parecido a lo anterior.<br />Impresión de trazas<br />
  31. 31. Loggers<br />
  32. 32. Ejemplo: Configuración de loggers<br />&lt;root&gt; <br /> &lt;priority value =&quot;debug&quot; /&gt; <br /> &lt;appender-ref ref=&quot;console&quot; /&gt; <br />&lt;/root&gt;<br />&lt;logger name=“edu.training.hibernate.domain.MyClass&quot;&gt; <br /> &lt;levelvalue=&quot;info&quot;/&gt; <br /> &lt;appender-refref=&quot; ConsoleAppender&quot; /&gt;<br />&lt;/logger&gt;<br />&lt;logger name=“edu.training.hibernate&quot; additivity=&quot;false&quot;&gt; <br /> &lt;levelvalue=“debug&quot; /&gt; <br /> &lt;appender-refref=&quot; FichHibernate&quot; /&gt; <br />&lt;/logger&gt;<br />&lt;logger name=“edu.training&quot; additivity=&quot;false&quot;&gt; <br /> &lt;levelvalue=“ALL&quot; /&gt; <br /> &lt;appender-refref=“file&quot; /&gt; <br />&lt;/logger&gt;<br />
  33. 33. Todo Appender necesita tener asociado un Layout (formato de salida de los mensajes)<br />Layouts<br />
  34. 34. Layouts<br />
  35. 35. Formatea la salida de los mensajes según el patrón de conversión especificado en una cadena de texto.<br />El patrón de conversión esta compuesto por literales de texto(cualquier literal) y expresiones de formato llamadas &quot;Conversionspecifiers“<br />Cada especificación de conversión empieza con el carácter &quot;%&quot; seguidos opcionalmente de modificadores de formato y conversión de caracteres<br />PatternLayout<br />Por ejemplo, definido un patrón de conversión:<br />&quot;%-5p [%t]: %m%n&quot; <br /> (en el fichero de configuración)<br />Escritura de la traza en código JAVA<br />Logger log = Logger.getLogger(MiClase.class);<br />log.debug(&quot;Message 1&quot;);<br />log.warn(&quot;Message 2&quot;);<br />Salida formateada según el patrón especificado<br />DEBUG [main]: Message 1<br />WARN [main]: Message 2<br />
  36. 36. 4.- Configuración e inicialización<br />
  37. 37. El entorno log4j es completamente configurable programáticamente <br />Sin embargo , es mucho más flexible configurar log4j usando archivos de configuración<br />Log4J se puede configurar mediante dos tipos de ficheros<br />Fichero de propiedades.- log4j.properties<br />Fichero XML .- log4j.xml<br />Configuración<br />
  38. 38. Los ficheros de configuración de propiedades son mucho mas complicados de entender y no tienen un orden claro.<br />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.<br />Log4j.properties<br />
  39. 39. Ejemplo: Log4j.properties<br /># initialise root logger with level DEBUG and call it BLAH<br />log4j.rootLogger=DEBUG, BLAH<br /># add a ConsoleAppender to the logger BLAH<br />log4j.appender.BLAH=org.apache.log4j.ConsoleAppender<br /># set set that layout to be SimpleLayout<br />log4j.appender.BLAH.layout=org.apache.log4j.SimpleLayout<br />
  40. 40. Su estructura viene definida en el fichero descriptivo log4j.dtd<br />Se suele colocar en un directorio accesible para la aplicación.<br />Normalmente en caso de las aplicaciones web dentro de la carpeta WEB-INF/classes<br />En algunas versiones de Tomcat hay que especificarlo en los scripts de arranque.<br />CATALINA_OPTS=&quot;-Dlog4j.configuration=log4j.xml“<br />http://wiki.apache.org/logging-log4j/Log4jXmlFormat<br />Log4j.xml<br />
  41. 41. Ejemplo: Log4j.xml<br />&lt;?xmlversion=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt; <br />&lt;!DOCTYPE log4j:configuration SYSTEM &quot;log4j.dtd&quot;&gt; <br />&lt;log4j:configuration xmlns:log4j=&quot;http://jakarta.apache.org/log4j/&quot;&gt; <br />&lt;appendername=&quot;console&quot; class=&quot;org.apache.log4j.ConsoleAppender&quot;&gt;<br /> &lt;paramname=&quot;Target&quot; value=&quot;System.out&quot;/&gt; <br /> &lt;layoutclass=&quot;org.apache.log4j.PatternLayout&quot;&gt; <br /> &lt;paramname=&quot;ConversionPattern&quot; value=&quot;%-5p %c{1} - %m%n&quot;/&gt; <br /> &lt;/layout&gt; <br />&lt;/appender&gt; <br />&lt;root&gt; <br /> &lt;priorityvalue =&quot;debug&quot; /&gt; <br /> &lt;appender-refref=&quot;console&quot; /&gt; <br />&lt;/root&gt; <br />&lt;/log4j:configuration&gt; <br />
  42. 42. Log4J se suele inicializar con la siguiente linea:<br />DOMConfigurator.configure(&quot;log4j.xml&quot;)<br />PropertyConfigurator.configure(&quot;log4j.lcf&quot;)<br />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.<br />Normalmente el nombre del fichero que contiene la configuración se encuentra como un parámetro de dicho servlet.<br />Inicialización<br />
  43. 43. Ejemplo: Inicialización servlet<br /> &lt;servlet&gt;<br /> &lt;servlet-name&gt;log4j-init&lt;/servlet-name&gt;<br /> &lt;servlet-class&gt;edu.training.jee.Log4jInit&lt;/servlet-class&gt;<br /> &lt;init-param&gt;<br /> &lt;param-name&gt;log4j-init-file&lt;/param-name&gt;<br /> &lt;param-value&gt;WEB-INF/classes/log4j.xml&lt;/param-value&gt;<br /> &lt;/init-param&gt;<br /> &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br /> &lt;/servlet&gt;<br />
  44. 44. Ejemplo: Inicialización servlet<br />package edu.training.jee;<br />import ...;<br />...<br />public class Log4jInit extends HttpServlet {<br /> public void init() {<br /> String prefix = getServletContext().getRealPath(&quot;/&quot;);<br /> String file = getInitParameter(&quot;log4j-init-file&quot;);<br /> if(file != null) {<br /> //PropertyConfigurator.configure(prefix+file);<br />DOMConfigurator.configure(prefix+file);<br /> }<br /> }<br />…<br />}<br />
  45. 45. 5.- Optimización<br />
  46. 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.<br />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.<br />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.<br />Optimización<br />
  47. 47. Cuando los logs son apagados el coste de los registros se limita únicamente a la invocación del método.<br />No esta demás decir que la invocación del método esconde el coste de la construcción del parámetro (mensaje).<br />Operador +<br />StringBuilder<br />Desactivar las trazas<br />
  48. 48. Se deben evitar lineas de código como por ejemplo:<br />logger.debug(&quot;Entrynumber: &quot; + i + &quot; is &quot; + String.valueOf(entry[i]));<br />Para evitar los costos de la construcción de los parámetros es recomendable verificar si el nivel esta activado.<br />Desactivar las trazas<br />if(logger.isDebugEnabled() ){<br />logger.debug(&quot;Entry number: &quot; + i + &quot; is &quot; + String.valueOf(entry[i]));<br />}<br />
  49. 49. Los layouts internamente al formatear el texto también involucran penalizaciones.<br />Una de las formas mas sencillas y rápidas incluso que el System.out.println es utilizar el SimpleLayout.<br />El coste de los layouts<br />
  50. 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.<br />Aditividad de los appenders<br />
  51. 51. Chainsaw<br />6.- Monitor de mensajes<br />
  52. 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.<br />Viene dentro log4j-1.2.xx.jar y se puede ejecutar desde línea de comandos<br />java -classpath log4j-1.2.15.jar org.apache.log4j.chainsaw.Main<br />También esta disponible desde el Java Web Start<br />http://logging.apache.org/chainsaw/download.html<br />Chainsaw<br />
  53. 53. Chainsaw<br /> &lt;appendername=&quot;FILE&quot; class=&quot;org.apache.log4j.RollingFileAppender&quot;&gt;<br /> &lt;errorHandlerclass=&quot;org.apache.log4j.helpers.OnlyOnceErrorHandler&quot;/&gt;<br /> &lt;paramname=&quot;File&quot; value=&quot;HolaMundoHibernate.log&quot;/&gt;<br /> &lt;param name=&quot;Threshold&quot; value=&quot;DEBUG&quot;/&gt;<br /> &lt;param name=&quot;Append&quot; value=&quot;false&quot;/&gt;<br /> &lt;param name=&quot;MaxFileSize&quot; value=&quot;5000KB&quot;/&gt;<br /> &lt;param name=&quot;MaxBackupIndex&quot; value=&quot;50&quot;/&gt;<br /> &lt;layoutclass=&quot;org.apache.log4j.xml.XMLLayout&quot; /&gt; <br /> &lt;/appender&gt;<br />&lt;logger name=&quot;org.hibernate.loader&quot;&gt;<br /> &lt;levelvalue=&quot;DEBUG&quot;/&gt;<br /> &lt;appender-refref=&quot;FILE&quot;/&gt;<br />&lt;/logger&gt;<br />
  54. 54. Chainsaw incorporado en log4j.1.2.15.jar<br />
  55. 55. Chainsaw desde el Java Web Start<br />
  56. 56. NO!<br />Una técnica consiste siempre en re direccionar a un fichero de texto, y luego este se puede inspeccionar con herramientas como:<br />tail.- en linux<br />Cualquier editor de texto, como por ejemplo vi, ultraedit, notepad++ …<br />La otra mandar los mensajes a bases de datos, para luego explotar la información con otras herramientas especializadas.<br />Chainsaw, ¿el único?<br />
  57. 57. Conclusiones<br />
  58. 58. Conclusiones<br />Usando la jerarquía de los loggers se pueden controlar granular mente que mensajes deseamos mostrar.<br />Ayuda a reducir el volumen de mensajes registrados.<br />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.<br />Ayuda a mejorar el rendimiento y el seguimiento de errores de las aplicaciones.<br />
  59. 59. - FIN -<br />Licensed under Creative Commons Attribution 3<br />Emmerson Miranda <br />SCJP 1.5<br />SCWCD J2EE 1.5<br />Blog : http://emmersonmiranda.blogspot.com/ <br />

×