Buscar
Social
Ofertas laborales ES
« Log4java (Parte 1) | Main | Cómo instalar Apache+SSL (+Tomcat) »
viernes
jun012001

Log4java (Parte 2)

Configurando log4j



En el anterior artículo aprendimos a usar BasicConfigurator, para
utilizar el API log4j de forma sencilla. Esta clase usa un PatternLayout
para mostrar la información que examinaremos a continuación,
para luego aprender a definir nuestros propias instancias de PatternLayout
y conseguir un log personalizado.


El PatternLayout de BasicConfigurator.



BasicConfigurator usa la cadena "%r [%t] %p %c %x -%m%n" como patrón
de conversión para el PatternLayout. Esta cadena se encuentra definida
estáticamente como PatternLayout.TTCC_CONVERSION_PATTERN. Con este
patrón de conversión, PatternLayout ofrece unos resultados
idénticos a los que se obtendrían usando el layout TTCC_Layout.



Ahora vamos a ver paso por paso como se utilizan estos patrones de conversión
(puede encontrar una descripción de todas las opciones que puede incluir
en un patrón de conversión en
http://jakarta.apache.org/log4j/docs/api/org/apache/log4j/PatterLayout.html

).




Las secuencias de carácteres que comienzan con el símbolo
%, son cadenas especiales que se reemplazan por información útil
sobre la aplicación que se está ejecutando.



Con %r mostramos el número de milisegundos desde el comienzo de
la aplicación hasta la petición del registro, en el ejemplo
del artículo anterior corresponde al 0, al 36 y al 51. Para mostrar
el nombre del hilo que generó la petición usamos %t, que como
además se encuentra entre corchetes hará que dicho nombre aparezca
de la misma forma ([main] en el ejemplo del artículo anterior). El
%p se usa para mostrar la prioridad (DEBUG, INFO, ...) del evento de log.
Con %c mostramos la categoría a la que pertenece el evento (en el
ejemplo del artículo anterior corresponde a com.foo.Bar y MyApp).
%x no hace que se muestre nada por pantalla, ya que en la aplicación
no hay contexto de diágnostico anidado (NDC -> nested diagnostic
context) asociado al hilo que generó el evento. Finalmente, con %m
mostramos el mensaje, y con %n se añade el separador de línea
que se use en la plataforma.




Además de los reemplazamientos, podemos utilizar modificadores de
formato al estilo de la familia de funciones printf en C. Para ello vamos
a ver en la siguiente tabla como formatear la cadena con la que se muestra
la categoría a la que pertenece el evento:

















































Modificador de formato

Justificación a izquierda Anchura mínima Anchura máxima Explicación
%20cno20noRellena a la izquierda con espacios si el nombre de la categoría
es menor de 20 carácteres. 
%-20c

20noRellena a la derecha con espacios si el nombre de la categoría
es menor de 20 carácteres.
%.30cN/Dno30Corta desde el principio si el nombre de la categoría
es más largo de 30 carácteres. 
%20.30cfalse2030Rellena a la izquierda con espacios si el nombre de la categoría
es menor de 20 carácteres. De lo contrario, si éste es más
largo de 30 carácteres lo corta desde el principio.    
%-20.30ctrue2030Rellena a la derecha con espacios si el nombre de la categoría
es menor de 20 carácteres. De lo contrario, si éste es más
largo de 30 carácteres lo corta desde el principio.    



Definiendo nuestro propio PatternLayout.



Después de la sección anterior, ya deberíamos de ser
capaces de especificar nuestro propio PatternLayout, y ampliarlo con la información
que podemos encontrar en los documentos del API. Para que sirva como ejemplo,
voy a proponer un PatternLayout que resultará extremadamente útil
en tiempo de depuración, dada la cantidad de información que
proporciona, pero que desaconsejo su uso en versiones finales por problemas
de eficiencia. El PatternLayout que usaremos a continuación será:
"%-5p [%d{ISO8601}] (%M [%C:%L]) - %m%n". Como nueva información,
tendremos la fecha del evento, y el método, la clase y la línea
en la que se produce el evento de log.



Usando PropertyConfigurator con nuestro PatternLayout.



Ahora que hemos aprendido a crear nuestro PatternLayout, debemos saber como
podemos usarlo en nuestras aplicaciones.



Para usar PropertyConfigurator nos crearemos un fichero con las siguientes
líneas:




log4j.rootCategory=DEBUG, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-5p [%d{ISO8601}] (%M [%C:%L]) - %m%n



Con la primera línea especificamos en primer lugar que para la categoría
raíz, sólo se mostrarán los mensajes de prioridad mayor
o igual que DEBUG, y que se usará como Appender (que veremos más
a fondo en el próximo artículo) A1. Se podría añadir
más de un Appender a una categoría separándolos por
comas tras la prioridad. Si quisiéramos definir una prioridad y un
Appender distintos para la categoría com.javahispano podríamos
a continuación añadir:


log4j.category.com.javahispano=INFO, A2


La segunda línea especifica el tipo de Appender, que ya veremos lo
que es. Basta con saber que este hará que toda la información
se nos muestre por pantalla.



La tercera línea hace que el layout del appender que estemos definiendo
sea del tipo PatternLayout.



La última línea es la que asigna el patrón de conversión
que queremos utilizar.



Ya podemos crear una pequeña aplicación para probar nuestro
PatternLayout:




import org.apache.log4j.*;

public class Log4jCap2 {

static Category cat = Category.getInstance(Log4jCap2.class.getName());

public static void main(String[] args) {
PropertyConfigurator.configure(args[0]);
cat.info("Entrando.");
Foo f = new Foo();
f.pru();
cat.info("Saliendo.");
}
}



A continuación vemos la clase Foo que se utiliza en nuestro programa.



import org.apache.log4j.*;

public class Foo {

static Category cat = Category.getInstance(Foo.class.getName());

public Foo() {
cat.debug("Creando un foo");
}

public void pru() {
cat.info("En pru");
}
}


Para ejecutar el programa de prueba simplemente tenemos que pasarle el nombre
que le hayamos dado al fichero de configuración como primer parámetro
y obtendremos:




INFO [2001-05-22 14:01:44,283] (main [Log4jCap2:9]) - Entrando.
DEBUG [2001-05-22 14:01:44,302] (<init> [Foo:7]) - Creando un foo
INFO [2001-05-22 14:01:44,304] (pru [Foo:11]) - En pru
INFO [2001-05-22 14:01:44,306] (main [Log4jCap2:12]) - Saliendo.


Usando DOMConfigurator con nuestro PatternLayout.



Como habrá visto, el esquema del fichero de configuración es
claramente jerárquico, por lo tanto, encaja perfectamente su descripción
dentro de un fichero XML.



Para usar ficheros XML para configurar el log, log4j nos ofrece la clase
DOMConfigurator. Esta clases es muy similar a PropertyConfigurator, pero
espera un fichero en un formato XML determinado por el fichero log4j.dtd (puedes descargar este fichero de aqui).
El fichero de configuración XML equivalente al que hemos usado anteriormente
es el que sigue:



<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
<appender name="A1" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p [%d{ISO8601}] (%M [%C:%L]) - %m%n"/>
</layout>
</appender>

<root>
<priority value ="debug" />
<appender-ref ref="A1" />
</root>
</log4j:configuration>



La aplicación de prueba quedará en este caso así:



import org.apache.log4j.*;
import org.apache.log4j.xml.*;

public class Log4jCap2 {

static Category cat = Category.getInstance(Log4jCap2.class.getName());

public static void main(String[] args) {
DOMConfigurator.configure(args[0]);
cat.info("Entrando.");
Foo f = new Foo();
f.pru();
cat.info("Saliendo.");
}
}



Y la salida será por supuesto equivalente:



INFO [2001-05-22 14:32:47,328] (main [Log4jCap2:10]) - Entrando.
DEBUG [2001-05-22 14:32:47,363] (<init> [Foo:7]) - Creando un foo
INFO [2001-05-22 14:32:47,365] (pru [Foo:11]) - En pru
INFO [2001-05-22 14:32:47,367] (main [Log4jCap2:13]) - Saliendo.


Próximo artículo.


En el próximo artículo veremos como usar los distintos tipos de Appenders que nos ofrece log4j.
















Roberto Casas compagina sus estudios de 5º de Ingeniería
Informática en el Centro Politécnico Superior de Zaragoza con su
trabajo en la empresa Master-D y javaHispano.



Para cualquier duda o tirón de orejas, e-mail a:
roberto_ARROBA_javahispano.com




Reader Comments

There are no comments for this journal entry. To create a new comment, use the form below.
Comentarios deshabilitados
Comentarios deshabilitados en esta noticia.