Como utilizar dinámicamente la librería Log4j

Visitas: 396  
Tiempo total: 8 días con 13:40:56 hrs  

Log4j es una librería Java que ayuda a registrar los errores de nuestras aplicaciones en un documento de texto externo. Es necesario porque ayuda a registrar los eventos que los desarrolladores utilizamos para encontrar las posibles causas de falla o error de la aplicación.

Una librería como Log4j es necesaria – porque es una práctica común la utilización de las consolas que los IDE Netbeans o Eclipse proveen para observar el estado y rendimiento de la aplicación mientras esta en desarrollo, el problema se presenta cuando se deja dicho entorno empezando a correr externamente y presentando en algunos casos problemas que requieren para su solución, un archivo que haya registrado los eventos ocurridos que provocaron su falla.

Esta librería la podemos descargar de la siguiente dirección:

http://logging.apache.org/log4j/1.2/download.html

De esta página descargarnos el archivo log4j-1.2.17.jar, en mi caso fue la versión 1.2.17 e idealmente la colocamos en la carpeta /tools en la misma dirección que contiene todos los archivos que hacen a nuestro proyecto Netbeans.

log4j

Para utilizarla, únicamente agregamos el .jar como librería a nuestro proyecto y creamos una variable global llamada log por ejemplo, lo importante es la implementación que se le debe de dar a la estructura completa de la aplicación porque es una mala práctica y atrocidad crear una aplicación con código totalmente disperso y sin ningún orden establecido, dejando a un lado el concepto de programación orientada a objetos.

clase

Con la variable global log, podremos acceder a ella desde la clase main que es la que inicializa e instancia a los objetos que utilizara la aplicación, así se creara únicamente un documento de texto con los errores que queremos registrar.

Instrucciones

La clase main debe de tener la siguiente variable pública y estática:

public static Logger log;

Ahora, para crear dinámicamente archivos de error deberemos de crear una carpeta llamada /log que contendrá el archivo llamado log4j.properties con el siguiente contenido:

log4j.rootLogger=DEBUG, Appender1,Appender2
log4j.appender.Appender1=org.apache.log4j.ConsoleAppender
log4j.appender.Appender1.layout=org.apache.log4j.PatternLayout
log4j.appender.Appender1.layout.ConversionPattern=%-7p %d [%t] %c %x - %m%n
log4j.appender.Appender2=org.apache.log4j.FileAppender
log4j.appender.Appender2.File=log/2014-06-07_19-45-41.txt
log4j.appender.FILE.ImmediateFlush=true
log4j.appender.Appender2.layout=org.apache.log4j.PatternLayout
log4j.appender.Appender2.layout.ConversionPattern=%-7p [%t] %x - %m%n
log = Logger.getLogger(Proyecto2.class.toString());

Aquí observamos las configuraciones necesarias para hacer funcionar la librería, la siguiente línea establece el nombre del fichero de errores:

log4j.appender.Appender2.File=log/2014-06-07_19-45-41.txt

Y en la siguiente línea, se indica la clase main de nuestro proyecto, en mi caso es Proyecto2.java:

log = Logger.getLogger(Proyecto2.class.toString());

Pero como nos hemos dado cuenta hasta ahora, la generación de errores es estática y no dinámica por que todos los archivos se llamaran como lo indica este archivo. La función que utilice para generalizar esta librería es la siguiente:

public static void nuevoLog(){
//direccion de log4j.properties
String log4j = System.getProperty("user.dir") + File.separator+"log"+File.separator + "log4j.properties";
load.direccion=new File(log4j);
load.log_file_direccion="log/"+obtenerFecha()+".txt";
//
load.contenido_direccion="log4j.rootLogger=DEBUG, Appender1,Appender2"+System.getProperty("line.separator");
load.contenido_direccion+="log4j.appender.Appender1=org.apache.log4j.ConsoleAppender"+System.getProperty("line.separator");
load.contenido_direccion+="log4j.appender.Appender1.layout=org.apache.log4j.PatternLayout"+System.getProperty("line.separator");
load.contenido_direccion+="log4j.appender.Appender1.layout.ConversionPattern=%-7p %d [%t] %c %x - %m%n"+System.getProperty("line.separator");
load.contenido_direccion+="log4j.appender.Appender2=org.apache.log4j.FileAppender"+System.getProperty("line.separator");
load.contenido_direccion+="log4j.appender.Appender2.File="+load.log_file_direccion+System.getProperty("line.separator");
load.contenido_direccion+="log4j.appender.FILE.ImmediateFlush=true"+System.getProperty("line.separator");
load.contenido_direccion+="log4j.appender.Appender2.layout=org.apache.log4j.PatternLayout"+System.getProperty("line.separator");
load.contenido_direccion+="log4j.appender.Appender2.layout.ConversionPattern=%-7p [%t] %x - %m%n"+System.getProperty("line.separator");
load.contenido_direccion+="log = Logger.getLogger(Proyecto2.class.toString());"+System.getProperty("line.separator");
open.guardar_archivo(".properties", "log4j");
log=Logger.getLogger("Proyecto2");
PropertyConfigurator.configure(log4j);
}

El objetivo es únicamente cambiar el nombre del archivo que se generara con cada ejecución del programa y crear el documento de configuración nuevamente, después inicializar la variable log.

Explicación

La instrucción a continuación almacena la dirección del archivo de configuración en la variable log4j, como lo había mencionado este archivo está ubicado en la carpeta /log:

String log4j = System.getProperty("user.dir") + File.separator+"log"+File.separator + "log4j.properties";

Ahora generamos el nuevo nombre del archivo de errores:

load.log_file_direccion="log/"+obtenerFecha()+".txt";

De acuerdo a la fecha de la función:

public static String obtenerFecha() {
DateFormat dateFormat = new SimpleDateFormat("yyy-MM-dd_HH-mm-ss");
Date date = new Date();
return dateFormat.format(date);
}

La clase load que observamos, permite la modificación al cliente de todas las variables generales de la aplicación configurando o cambiando la interfaz y forma de ejecución del programa. Siguiendo con el código, observamos el texto general del archivo log4j.properties. A continuación, creamos este archivo en disco:

open.guardar_archivo(".properties", "log4j");

La función guardar_archivo(Extensión, Nombre) la omito por ser parte de varias clases más producto de mi propia implementación. Ahora, una vez es creado o reescrito en disco, inicializamos la variable log global de la siguiente manera:

log=Logger.getLogger("Proyecto2");
PropertyConfigurator.configure(log4j);

Y finalmente, para utilizarla usamos el siguiente código:

try{
parser.parse();
}catch(Exception e){
Proyecto2.log.warn("Parser de formato estandar en ventana.java:"+e.toString());
}

Aquí almacenamos el posible error que pueda surgir al llamar a algún método o función en nuestro programa utilizando el nivel de prioridad de advertencia (warn), existen ocho niveles que se pueden utilizar para describir a los errores, puedes consultarlos en la página de Wikipedia a continuación.

Referencias

[http://logging.apache.org/log4j/1.2/download.html]
[http://es.wikipedia.org/wiki/Plataforma_Java]


Para recibir boletines de información, por favor escribe tu correo electrónico:

Por favor ingrese un correo electrónico valido.
Registrado correctamente!