Contacto

Nos puedes enviar un artículo a publicar (si te fue útil, seguro que a otros también).
Nos puedes sugerir temas/profundidad de interés.
correo-e - perfil

Busquedas

comenzando con log4j - logs en java

Esto es apenas una pequeña introducción a log4j, no un manual.
Espero ayude para comprender y comenzar a usar.

Suele ser normal cuando programamos, imprimir mensajes (en consola o un archivo), por diferentes motivos, como ser, saber si el programa esta pasando por algún punto en particular, conocer el valor de una variable, un mensaje de error, etc. No es extraño ver en el codigo líneas como: System.out.println("me conecto a la base ...");
También puede ser requerimiento de la aplicación, almacenar información de negocio, como ser datos de alguna transacción, fecha/hora cuentas involucradas y monto de una transferencia bancaria, etc.

Si bien resulta sencillo imprimir mensajes con: System.out.println(...) (sin considerar en esta oportunidad el costo de esa llamada), cuando queremos dejar de ver los mensajes (o activarlos nuevamente), se requiere modificar el código, y compilarlo.
La información de negocio se suele almacenar en un archivo, o en una bd (o en ambos), por lo que println() deja de ser una opción.

Es en estos casos donde log4j entra en acción.
Nos permite configurar en un archivo, los tipos de mensajes queremos imprimir (debug, info, error, etc), donde queremos dirigir los mensajes (consola, un archivo, una base de datos, ...), el formato como queremos mostrar la información.
También es posible realizar la configuración en el programa, con la necesidad de compilar con cada cambio.

Vamos a introducir algunos conceptos que vamos a usar en un ejemplo sencillo al terminar el artículo.

1) Nivel o prioridad de log:
En la configuración, indicamos el nivel de prioridad que se habilita.
Estos niveles son jerárquicos:
ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF.
ALL significa que se habilita todos los logs, mientras que OFF deshabilita todos los logs.
Como ejemplo, si habilitamos el nivel WARN, se van a guardar los mensajes que pertenecen a: WARN, ERROR y FATAL.

2) Logger: La propiedad Logger es donde se configura el elemento a enviar los mensajes (por ej, las clases dentro de un paquete dado).

3) Appender: Mediante los appenders indicamos el/los destino/s de salida de los mensajes.
Si bien podemos crear nuestros propios appenders, existen varios ya creados que podemos usar, como ser: ConsoleAppender (imprime log en consola), FileAppender o RollingFileAppender (para almacenar los mensajes en un archivo, en el último, se puede indicar, por ejemplo, tamaño máximo del archivo, y cantidad de archivos a almacenar), JDBCAppender (almacenar los mensajes en una base de datos), SyslogAppender (envía la salida al syslog en sistemas linux/unix).

4) Layout: Mediante el objeto Layout se formatea el estilo de la información  que se almacena en el log.

Configuracion log4j:
La configuración de log4j puede hacerse por programación, por medio de un archivo propertie de java, o por medio de un archivo xml.
Para nuestro ejemplo vamos a usar el archivo xml. Por defecto, este se tiene que llamar log4j.xml, y tiene que estar en el claspath usado
para la carga de las clases.

ejemplo log4j.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- CONSOLA -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="[%p] [%d{dd/MM/yyyy HH:mm:ss}] [%c]:%L - %m%n" />
</layout>
</appender>
<!-- ARCHIVO -->

<appender name="logfile" class="org.apache.log4j.RollingFileAppender">
<param name="file" value="/tmp/ejemplol4j/test.log" />
<param name="append" value="true" />
<param name="MaxFileSize" value="512KB"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %p [%c] - %m%n" />
</layout>
</appender>

<logger name="testl4j" additivity="false">
<level value="info" />
<appender-ref ref="console" />
<appender-ref ref="logfile" />
</logger>

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

Descripción de log4j.xml
1.1) Indicamos un appender para enviar los mensajes a la consola
<appender name="console" class="org.apache.log4j.ConsoleAppender">
1.2) Le damos un formato a los mensajes
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="[%p] [%d{dd/MM/yyyy HH:mm:ss}] [%c]:%L - %m%n" />
</layout>

%p: muestra la prioridad del log que se imprime
%d: muestra la fecha en que se imprime el log, y en este caso, so formatea como se quiere ver la fecha/hora
%c: muestra el objeto que imprime el log.
%L: el número de línea donde se genera el log.
%m: el mensaje que se quiere imprimir.
%n: imprime un salto de linea.

2.1) Indicamos otro appender, en este caso, para enviar los mensajes a un archivo.
<appender name="logfile" class="org.apache.log4j.RollingFileAppender">
2.2) Configuramos algunos parámetros para este appender:
El archivo donde se almacena el log (en este caso, se usa un equipo con linux)
<param name="file" value="/tmp/ejemplol4j/test.log">
Indicamos que el archivo no se sobrescriba cada vez que comienza la aplicación.
<param name="append" value="true">
Indicamos el tamaño máximo de los archivos de log.
<param name="MaxFileSize" value="512KB">
2.3) El formato en el layout es similar al de consola, pero cambiamos el orden de la información de salida, y a la fecha no se le dio un formato en particular.

3) Configuramos el elemento 'logger'. Indicamos el elemento raíz que va a enviar mensajes (en este caso, objetos en el paquete testl4j)
Con additivity="false" los mensajes se imprimen 1 vez, sino se verá el mensaje por el propio logger, y luego por el "root".
<logger name="testl4j" additivity="false">
Indicamos el nivel de prioridad que se permite

<level value="info"></level>
Indicamos a donde se va a enviar los mensajes, en este caso, se envía a la consola y al archivo.
<appender-ref ref="console"></appender-ref>
<appender-ref ref="logfile"></appender-ref>
obviamente, podemos agregar tantos logger's como nos sea necesario.

4) Indicamos el log por defecto. Si un elemento envía un mensaje de log, y no está indicado ese elemento en el logger, se utiliza la esta configuración.
En nuestro ejemplo, se imprime a partir de la prioridad de debug (no es una buena opción en general, pero sí para nuestro ejemplo), y solo enviamos los mensajes a consola
<root>
<priority value="debug"></priority>
<appender-ref ref="console"></appender-ref>
</root>

La clase para la prueba de log4j.
Creamos la clase: Main, dentro del paquete: testl4j

Main.java
---------
package testl4j;
import org.apache.log4j.Logger;
public class Main {
private static Logger _log = Logger.getLogger(Main.class);
public static void main(String[ ] args) {
_log.info(" Iniciando prueba de log4j");
_log.debug(" Iniciando prueba de log4j");
}
}

En este caso enviamos 2 mensajes de log, uno de nivel "info", y el siguiente de nivel "debug".

1er Ejemplo)
-------------------
Al ejecutar el programa, obtenemos la siguiente salida:
1) Consola
[INFO] [10/01/2010 19:32:52] [testl4j.Main]:24 - Iniciando prueba de log4j
2) Archivo
2010-01-10 19:32:52,880 INFO [testl4j.Main] - Iniciando prueba de log4j

En el logger para "testl4j", indicamos que el nivel de prioridad habilitado es "info", por este motivo, no se muestra el mensaje de "debug".

2do Ejemplo)
-------------------
Para esta prueba, eliminamos del archivo log4.xml, todas las lineas de "logger".
Al hacer esto, no se tiene una configuración específica para el paquete testl4j, por lo que utiliza la configuración por defecto( "root")
Al ejecutar el programa, obtenemos la siguiente salida:
1) Consola
[INFO] [10/01/2010 19:40:51] [testl4j.Main]:24 - Iniciando prueba de log4j
[DEBUG] [10/01/2010 19:40:51] [testl4j.Main]:25 - Iniciando prueba de log4j
2) Archivo


En consola se imprime tanto el mensaje de debug y el de info, ya que el nivel de prioridad por defecto se configuro con "debug".
En el archivo de configuración no se imprime ningún mensaje, ya que solo se configuro un append por defecto, el de consola.

Por mayor información, parámetros, appenders, etc, la pagina de log4j es: http://logging.apache.org/log4j

1 comentario:

Unknown dijo...

muy claro, me sirvio bastante