config log4j

18
GNU Free Documentation License En linea http://www.geocities.com/neos_software/articles/j2se/log4j.html INDICE Página Acerca del Autor…………………………………………………………………….2 Agradecimientos…………………………………………………………………….2 Comentario:………………………………………………………………………….2 Trabajando con LOG4j…………………………………………………………......3 Introducción………………………………………………………………………….3 ¿Porque no usar System.out.println?...............................................................3 Jakarta-Log4j……………………………………………………………………….. 3 Características básica de Log4j…………………………………………………...4 Diagrama de Componentes LOG4J……………………………………………….4 Niveles de prioridad de trazas en Log4j…………………………………………. 5 Tipos de Configuración de Log4j…………………………………………………. 5 Laboratorio………………………………………………………………………….10 Referencias…………………………………………………………………………..19 1

Upload: manuel-calles-lazcano

Post on 04-Mar-2015

144 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Config Log4j

GNU Free Documentation License En linea http://www.geocities.com/neos_software/articles/j2se/log4j.html

INDICE

Página

Acerca del Autor…………………………………………………………………….2Agradecimientos…………………………………………………………………….2Comentario:………………………………………………………………………….2Trabajando con LOG4j…………………………………………………………......3Introducción………………………………………………………………………….3¿Porque no usar System.out.println?...............................................................3Jakarta-Log4j……………………………………………………………………….. 3Características básica de Log4j…………………………………………………...4Diagrama de Componentes LOG4J……………………………………………….4Niveles de prioridad de trazas en Log4j…………………………………………. 5Tipos de Configuración de Log4j…………………………………………………. 5Laboratorio………………………………………………………………………….10Referencias…………………………………………………………………………..19

1

Page 2: Config Log4j

GNU Free Documentation License En linea http://www.geocities.com/neos_software/articles/j2se/log4j.html

Fecha de publicación: 16/Octubre/2006Acerca del Autor:

Héctor Hugo Hidalgo Martínez.Programador Java Egresado de la Facultad de Ingeniería en Computación del Estado de MéxicoE-mail: [email protected], [email protected]

Agradecimientos: Quiero agradecer el apoyo, amor y calma brindado por mi familia (Veró,Judith,Janet) y también por el apoyo técnico de mi hermano Mario Hidalgo. Ya que siempre están conmigo para ayudarme.

Comentario: Este tutorial esta abierto para hacerle modificaciones con la finalidad de mejorar constantemente, así que si estas interesado en agregar algo más solo contáctame para hacer las modificaciones pertinentes.

2

Page 3: Config Log4j

GNU Free Documentation License En linea http://www.geocities.com/neos_software/articles/j2se/log4j.html

Trabajando con LOG4j

Introducción.

Actualmente las aplicaciones productivas (las de la vida real) siempre surge la necesidad de estar monitoreando la aplicación, ya sea desde la consola del servidor Web, o bien desde un archivo log.

¡Quien no ha puesto un System.out.println para escribir en la consola el valor de una variable? O bien el típico mensaje: voy aquí!!!. Sin duda alguna, esta es la forma más sencilla y más utilizada para la depuración de nuestro código.

¿Porque no usar 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 el debugeo.• No se puede deshabilitar los mensajes, ya que están en código duro.

En base a esta idea se han ido creando sistemas de gestión de logs/trazas que han ido añadiendo diversas funcionalidades demandadas por los programadores.

Jakarta-Log4j

Jakarta-Log4j es potente y conocido proyecto para el debugeo de aplicaciones. La primera versión de log4j se escribió para el proyecto de SEMPER1. En los Estados Unidos a cargo de N. Asokan, Ceki Gülcü y Michael Steiner en el año de 1996, aunque Log4j ha cambiado considerablemete, todavía conserva ideas de esa primera versión. Después log4j mejoro de la mano de IBM Zurich 2(laboratorio de investigación), sin embargo hoy en día ya no ninguna asociacón con dicha empresa. El logotipo de log4j fue diseñado y amablemente donado por Cyberlab SA de Suiza.

La figura 1.0 muestra el logo de Log4j

1 http://www.semper.org/ 5/Septiembre/062 http://www.zurich.ibm.com/ 5/Septiembre/06

3

Page 4: Config Log4j

GNU Free Documentation License En linea http://www.geocities.com/neos_software/articles/j2se/log4j.html

Figura 1.0Características básicas de Log4j

Entre sus características principales se encuentran:

• Diferentes niveles de traza. (Error, información, depurar.) • Filtros según categoría • Redirección de las trazas a diferentes destinos. (A un archivo, a consola, a Base de

datos, etc) • Diferentes formatos de visualización. (Visualizar fecha, línea, nombre de la clase,

etc) • Configuración por ficheros

Diagrama de Componentes LOG4J

A continuación se presenta la figura 2.0 con el diagrama de componentes de Log4j

Aplicación

1..*

Figura 2.0

4

Logger

Level

Appender

Filter Layout

1.-Clase principal de Log4jLas aplicaciones hacen llamadas a los objetos LoggerLos nombres de los Loggers son case-sensitive.Permite la categorización de mensajes de error,

Lo cual permite el control granular de los mensajes.5.- Representa la severidad de los mensajes

2.- Salida de destino: consola, archivo,BD,ect.

5.- Se permite filtrar los mensajes basado en los niveles de severidad

3.- Representa el formato de salida de acuerdo a patrones de conversión.

Page 5: Config Log4j

GNU Free Documentation License En linea http://www.geocities.com/neos_software/articles/j2se/log4j.html

Niveles de prioridad de trazas en Log4j

Log4j tiene los siguientes niveles de traza:

• OFF: no se muestra en ningún mensaje (se encuentra apagado el debugeo)• FATAL: para mostrar mensajes de situaciones que probablemente harán abortar la

aplicación • ERROR: para mostrar mensajes de errores que no son deseados pero que no

interrumpirán la aplicación.• WARN: para mostrar mensajes de contextos peligrosos para la aplicación, o ciertas

operaciones de uso no recomendado • INFO: para mostrar mensajes de información sobre la ejecución de la aplicación, o

eventos importantes dentro de la misma • DEBUG: para mostrar mensajes interesantes para depurar la aplicación. Muy

orientado al tiempo de desarrollo.• ALL: se muestra en todos los casos

Cuando escribimos nuestras aplicaciones, las trazas se escriben en los diferentes niveles dependiendo de la operación que se utilice. Así para escribir en el nivel INFO se usa log.info("Nivel Info"); y para el nivel DEBUG log.debug("Nivel Debug").

Por lo general el nivel de prioridad esta fijado por defecto a INFO, por lo que los mensajes de nivel DEBUG no son visualizados. Este nivel genera un caudal elevado de trazas por lo que su uso suele estar restringido a entornos de desarrollo.

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

Tipos de Configuración de Log4j

• Mediante un archivo de propiedades.• Mediante un archivo XML.

Lo más normal sería comenzar con la configuración de archivo de propiedades, pero la razón por la cual no se hará de esa forma es que hoy en día 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.

5

Page 6: Config Log4j

GNU Free Documentation License En linea http://www.geocities.com/neos_software/articles/j2se/log4j.html

A continuación se presenta un ejemplo de configuración 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="Fichero" class="org.apache.log4j.FileAppender"> <param name="File" value="A1.log" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%t %-5p %c{2} - %m%n"/> </layout> </appender>

<appender name="Consola" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/> </layout> </appender>

<root> <priority value ="debug" /> <appender-ref ref="Consola" /> <appender-ref ref="Fichero " /> </root>

</log4j:configuration>

Comenzaremos por explicar la línea: <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">.La línea anterior indica que debemos tener la dtd log4j la cual marca la reglas de sintaxis que debemos considerar en el momento de estar configurando Log4j mediante un archivo XML, aunque por el momento no entraremos en detalle sobre el código fuente de esta dtd, colocaremos el código de dicho archivo:

<?xml version="1.0" encoding="UTF-8" ?> <!-- Authors: Chris Taylor, Ceki Gulcu. --><!-- Version: 1.2 --><!-- A configuration element consists of optional rendererelements,appender elements, categories and an optional rootelement. --><!ELEMENT log4j:configuration (renderer*, appender*,(category|logger)*,root?, categoryFactory?)><!-- The "threshold" attribute takes a level value such that all --><!-- logging statements with a level equal or below this value are --><!-- disabled. -->

<!-- Setting the "debug" enable the printing of internal log4j logging --><!-- statements. -->

<!-- By default, debug attribute is "null", meaning that we not do touch --><!-- internal log4j logging settings. The "null" value for the threshold -->

6

Page 7: Config Log4j

GNU Free Documentation License En linea http://www.geocities.com/neos_software/articles/j2se/log4j.html

<!-- attribute can be misleading. The threshold field of a repository --><!-- cannot be set to null. The "null" value for the threshold attribute --><!-- simply means don't touch the threshold field, the threshold field --> <!-- keeps its old value. --> <!ATTLIST log4j:configuration xmlns:log4j CDATA #FIXED "http://jakarta.apache.org/log4j/" threshold (all|debug|info|warn|error|fatal|off|null) "null" debug (true|false|null) "null">

<!-- renderer elements allow the user to customize the conversion of --><!-- message objects to String. -->

<!ELEMENT renderer EMPTY><!ATTLIST renderer renderedClass CDATA #REQUIRED renderingClass CDATA #REQUIRED>

<!-- Appenders must have a name and a class. --><!-- Appenders may contain an error handler, a layout, optional parameters --><!-- and filters. They may also reference (or include) other appenders. --><!ELEMENT appender (errorHandler?, param*, layout?, filter*, appender-ref*)><!ATTLIST appender name ID #REQUIRED class CDATA #REQUIRED>

<!ELEMENT layout (param*)><!ATTLIST layout class CDATA #REQUIRED>

<!ELEMENT filter (param*)><!ATTLIST filter class CDATA #REQUIRED>

<!-- ErrorHandlers can be of any class. They can admit any number of --><!-- parameters. -->

<!ELEMENT errorHandler (param*, root-ref?, logger-ref*, appender-ref?)> <!ATTLIST errorHandler class CDATA #REQUIRED >

<!ELEMENT root-ref EMPTY>

<!ELEMENT logger-ref EMPTY><!ATTLIST logger-ref ref IDREF #REQUIRED>

<!ELEMENT param EMPTY><!ATTLIST param name CDATA #REQUIRED value CDATA #REQUIRED>

7

Page 8: Config Log4j

GNU Free Documentation License En linea http://www.geocities.com/neos_software/articles/j2se/log4j.html

<!-- The priority class is org.apache.log4j.Level by default --><!ELEMENT priority (param*)><!ATTLIST priority class CDATA #IMPLIED value CDATA #REQUIRED>

<!-- The level class is org.apache.log4j.Level by default --><!ELEMENT level (param*)><!ATTLIST level class CDATA #IMPLIED value CDATA #REQUIRED>

<!-- If no level element is specified, then the configurator MUST not --><!-- touch the level of the named category. --><!ELEMENT category (param*,(priority|level)?,appender-ref*)><!ATTLIST category class CDATA #IMPLIED name CDATA #REQUIRED additivity (true|false) "true" >

<!-- If no level element is specified, then the configurator MUST not --><!-- touch the level of the named logger. --><!ELEMENT logger (level?,appender-ref*)><!ATTLIST logger name ID #REQUIRED additivity (true|false) "true" >

<!ELEMENT categoryFactory (param*)><!ATTLIST categoryFactory class CDATA #REQUIRED>

<!ELEMENT appender-ref EMPTY><!ATTLIST appender-ref ref IDREF #REQUIRED>

<!-- If no priority element is specified, then the configurator MUST not --><!-- touch the priority of root. --><!-- The root category always exists and cannot be subclassed. --><!ELEMENT root (param*, (priority|level)?, appender-ref*)>

<!-- ==================================================================== --><!-- A logging event --><!-- ==================================================================== --><!ELEMENT log4j:eventSet (log4j:event*)><!ATTLIST log4j:eventSet xmlns:log4j CDATA #FIXED "http://jakarta.apache.org/log4j/" version (1.1|1.2) "1.2" includesLocationInfo (true|false) "true">

8

Page 9: Config Log4j

GNU Free Documentation License En linea http://www.geocities.com/neos_software/articles/j2se/log4j.html

<!ELEMENT log4j:event (log4j:message, log4j:NDC?, log4j:throwable?, log4j:locationInfo?) >

<!-- The timestamp format is application dependent. --><!ATTLIST log4j:event logger CDATA #REQUIRED level CDATA #REQUIRED thread CDATA #REQUIRED timestamp CDATA #REQUIRED>

<!ELEMENT log4j:message (#PCDATA)><!ELEMENT log4j:NDC (#PCDATA)>

<!ELEMENT log4j:throwable (#PCDATA)>

<!ELEMENT log4j:locationInfo EMPTY><!ATTLIST log4j:locationInfo class CDATA #REQUIRED method CDATA #REQUIRED file CDATA #REQUIRED line CDATA #REQUIRED>

Continuando con la explicación del archivo de configuración XML, explicaremos la siguiente línea de código:<appender name="Fichero" class="org.apache.log4j.FileAppender">En esta línea de código se configura un appender3 (recuerde que un appender es una salida de destino) de Archivo, el cual tiene por nombre “Fichero”.

<param name="File" value="aplicacionLog.log" />La línea anterior indica parámetros del appender el cual para este caso es “File” el cual contiene un valor “aplicacionLog.log”. Este valor indica el nombre del archivo donde se guardaran los mensajes de la aplicación.

<layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%t %-5p %c{2} - %m%n"/></layout> En esta parte de configura en layout4 (recuerde que un layout representa el formato de salida de los mensajes) el cual tiene por nombre “ConversionPattern”, cabe señalar que este nombre no se puede modificar por otro ya que esta configurando a la clase org.apache.log4j.PatternLayout la palabra value indica el formato 5(entiendase por formato la descripción de la hora, fecha, clase donde se genero el mensaje, etc) que tendrá el archivo “aplicationLog.log”.

<appender name="Consola" class="org.apache.log4j.ConsoleAppender">La línea anterior configura un appender de Consola y el cual tiene el mismo principio del appender anterior (appender de Archivo).

3 http://ia.wiktionary.org/wiki/Interlingua-Espaniol_a 6/Septiembre/20064 http://es.tldp.org/ORCA/glosario.html 6/Septiembre/20065 http://www.mastermagazine.info/definicion/5044.php 6/Septiembre/2006

9

Page 10: Config Log4j

GNU Free Documentation License En linea http://www.geocities.com/neos_software/articles/j2se/log4j.html

<root><priority value ="debug"/><appender-ref ref="Consola"/><appender-ref ref="Fichero"/>

</root>

En las líneas anteriores se realiza de configuración de la granularidad de mensajes (en que clases java se realizara el envió de mensajes). Para este ejemplo manejara el envió de mensajes de toda la aplicación ya que estamos manejadolo a nivel root. La prioridad será de la forma “debug” y los appenders manejados Consola y Fichero, que con anterioridad configuramos.

Cabe señalar que en un proyecto productivo no debe estar la configuración de root sino más bien la configuración de un o unos paquetes en especial.

Después de haber visto un pequeño ejemplo de appenders se aclara que hay más configuraciones como lo son:

• Console• File• rolling file• GUI• TCP/IP• NT Event log• Unix Syslog daemon• JDBC• SMTP• JMS

Laboratorio

Después de haber explicado los conceptos teóricos sobre Log4j vamos a realizar una práctica con proyecto Java standalone.

Requisitos necesarios para realizar la practica:• Tener instalado una versión de eclipse (en mi caso utilizare la versión 3.1), en caso

de contar con este IDE, puede dirigirse a la siguiente dirección para poder descargarlo: http://www.eclipse.org/downloads/index_project.php

• Contar con el siguiente jar: Para este caso se va ocupar la última versión de Log4j la cual es log4j-1.2.13.jar (versión cuando se realizo este tutorial).

Práctica 1

1. Crear un proyecto Java con el nombre: TesStandalone_Log4j2. Crear una carpeta con el nombre de lib.

10

Page 11: Config Log4j

GNU Free Documentation License En linea http://www.geocities.com/neos_software/articles/j2se/log4j.html

3. Una vez creada la carpeta, vamos a copiar el jar de Log4j, para esta practica utilizaremos la versión 1.2.13 ya que es la más actual al realizar este tutorial.

4. Ahora vamos a relacionar el jar con el proyecto, el cual se muestra con las figuras que se presentan a continuación:

11

Page 12: Config Log4j

GNU Free Documentation License En linea http://www.geocities.com/neos_software/articles/j2se/log4j.html

12

Page 13: Config Log4j

GNU Free Documentation License En linea http://www.geocities.com/neos_software/articles/j2se/log4j.html

5. Ahora vamos a proceder a configurar el archivo XML, por lo cual vamos a crear las siguiente carpeta dtds y dentro de ella vamos a crear un archivo con el nombre log4j.dtd

6. Ahora copiaremos el código de la dtd (el ejemplo que explicamos) dentro del archivo log4j.dtd

13

Page 14: Config Log4j

GNU Free Documentation License En linea http://www.geocities.com/neos_software/articles/j2se/log4j.html

7. Ahora vamos a crear el archivo XML el cual contendrá los appenders, para esto elegimos la raíz del proyecto y creamos un archivo llamado: loggin.xml.

8. Una vez creado el archivo loggin.xml colocaremos las siguientes líneas de código:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "dtds/org/apache/log4j/xml/log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">

<appender name="console" class="org.apache.log4j.ConsoleAppender"><layout class="org.apache.log4j.PatternLayout">

<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%c] %-5p - %m%n" />

</layout></appender>

<appender name="file" class="org.apache.log4j.FileAppender"> <!-- name is the path and name of the log file. --> <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> <root> <level value="debuger"></level> <appender-ref ref="console"/> </root></log4j:configuration>

9. Ahora pasaremos a la implementación de algunas clases java para mostrar el funcionamiento de Log4j. Vamos a crear dos paquetes los cueles son: org.neos.actions y org.neos.logger

14

Page 15: Config Log4j

GNU Free Documentation License En linea http://www.geocities.com/neos_software/articles/j2se/log4j.html

10. Después de la creación de los paquetes vamos a crear las siguientes clases: Action en el paquete org.neos.actions y Bar, MyApp dentro de org.neos.logger

El código fuente que escribiremos dentro de la clase Action será el siguiente:package org.neos.actions;

package org.neos.actions;import org.apache.log4j.Logger;

public class Action { static Logger logger = Logger.getLogger(Action.class); public static void hola() {

logger.debug("Estoy en un action");

}

}

El código fuente que escribiremos dentro de la clase Bar será el siguiente:

package org.neos.logger;import org.apache.log4j.Logger;

15

Page 16: Config Log4j

GNU Free Documentation License En linea http://www.geocities.com/neos_software/articles/j2se/log4j.html

public class Bar { static Logger logger = Logger.getLogger(Bar.class); public void doIt() {

logger.debug("Dentro de Bar!"); } }

El código fuente que escribiremos dentro de la clase MyApp será el siguiente:

package org.neos.logger;

import org.apache.log4j.Logger;import org.apache.log4j.xml.DOMConfigurator;import org.neos.actions.Action; public class MyApp { // Define una variable estática que tiene una referencia // a una instancia de Logger llamada "MyApp". static Logger logger = Logger.getLogger(MyApp.class); public static void main(String[] args) {

//Configuracion XML DOMConfigurator.configure("logging.xml");

logger.info("Entrando en la aplicación."); Bar bar = new Bar(); logger.error("Ocurrio una excepcion"); bar.doIt(); Action.hola(); logger.info("Saliendo de la aplicación.");

} }

11. Bueno hasta este momento hemos creado toda la estructura que necesitamos para poder configurar Log4j. Ahora es tiempo de explicar el código fuente, así que comenzaremos con la clase principal la cual es: MyApp

static Logger logger = Logger.getLogger(MyApp.class);La línea anterior tiene una referencia a una instancia de logger, con esta línea estaremos configurando todos la clase para poder uso de log4j y poder mandar mensajes, dependiendo de los appender configurados (para nuestro caso iran a consola y a un archivo log)

DOMConfigurator.configure("logging.xml");La línea anterior realiza el parseo del archivo loggin.xml el cual contiene la configuración de los appenders (si no hay appenders configurados enviara el siguiente error en consola: log4j:WARN No appenders could be found for logger (org.neos.logger.MyApp).log4j:WARN Please initialize the log4j system properly.

16

Page 17: Config Log4j

GNU Free Documentation License En linea http://www.geocities.com/neos_software/articles/j2se/log4j.html

).logger.info("Entrando en la aplicación.");La línea anterior realiza un tipo de nivel info (anteriormente mencionamos los tipos de nivel de severidad) el cual indica procesos informativos para el programador

logger.error("Ocurrio una excepcion");La línea anterior realiza un tipo de nivel error el cual indica que la aplicación ha caído en une error no esperado (recuerde que este es solo un ejemplo ilustrativo y el manejo de los niveles dependerá del programador y de la aplicación manejada).

12. Bueno ahora solo falta la prueba del código ya explicado, asi que para correr el proyecto solo hay que elegir la clase MyApp hacer clic con el botón derecho y elegir la opción Run asJavaApplication

Después de realizar lo descrito nos deberá aparecer en la consola de desarrollo el siguiente resultado

Ahora solo restaría realizar la prueba con el appender file ya que si ve su código fuente del archivo XML esta configurado para dos appenders, los cuales son console y file, por lo cual se propone como práctica final la realización de la prueba de generación del archivo log de esta práctica.

El resultado de la creación del archivo log sería:

17

Page 18: Config Log4j

GNU Free Documentation License En linea http://www.geocities.com/neos_software/articles/j2se/log4j.html

Su contenido debe ser el siguiente:

[Time: 2006-09-05 15:51:48,037] [Thread: main] [Level: INFO]Entrando en la aplicación.[Time: 2006-09-05 15:51:48,037] [Thread: main] [Level: ERROR]Ocurrio una excepcion[Time: 2006-09-05 15:51:48,037] [Thread: main] [Level: DEBUG]Dentro de Bar![Time: 2006-09-05 15:51:48,037] [Thread: main] [Level: DEBUG]Estoy en un action[Time: 2006-09-05 15:51:48,037] [Thread: main] [Level: INFO]Saliendo de la aplicación.

Neos Sofware Labs 2002-2006

18