Log4J: Cómo crear distintos logs en función de su naturaleza y nivel

0
47869

Log4J: Cómo crear distintos logs en función de su naturaleza y nivel

Una tarea fundamental en todo proyecto informático es la generación de log o trazas, generalmente para detectar y solucionar los posibles errores
que pudieran producirse.

En mi experiencia en este sector he observado que normalmente los programadores dejan sus logs en un archivo mismo archivo independientemente de su naturaleza (entrada/salida, seguridad, interfaz gráfico, etc.) y nivel (debug, info, warn, etc.).
Yo particularmente no estoy del todo deacuerdo con esté método. Soy más partidario de crear varios archivos y así no mezclar peras con manzanas. Con esto consigo detectar los problemas más rapidamente,
así como para tener mayor flexibilidad a la hora de cambiar los niveles de traceo en determinadas partes de la aplicación según las necesidades.

Una aplicación medianamente bien diseñada organizará sus clases en paquetes en donde las clases tienen algún tipo de relacción semántica.

Por ejemplo, las clases de acceso a datos no deberían estar en el mismo paquete que clases de interfaz gráfica.

En este tutorial vamos a generar 4 archivos de Logs:

  • tuApplicationName.log:
    En este archivo dejaremos todas las salidas de log, independientemente de su naturaleza y nivel.
  • tuApplicationNameErrorFile.log:
    En este archivo dejaremos las salidas de avisos o errores (No los de debug o info) de cualquier parte de la aplicacion.
  • tuApplicationNameErrorFile1.log:
    En este archivo dejaremos las salidas de avisos o errores (No los de debug o info) de cualquier clase del paquete com.autentia.tutoriales.log4j.paquete1 o sus subpaquetes.
  • tuApplicationNameErrorFile2.log:
    En este archivo dejaremos las salidas de avisos o errores (No los de debug o info) de cualquier clase del paquete com.autentia.tutoriales.log4j.paquete2 o sus subpaquetes.
package com.autentia.tutoriales.log4j;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.xml.DOMConfigurator;

/**
 * Ejemplo del tutorial 
 * @author Carlos García. Creador de MobileTest. 
 * @see http://www.mobiletest.es
 */
public class EjemploLog {
	/**
	 * Punto de entrada a la aplicación
	 */
	public static void main(String[] args) {
		// Cargamos la configuración de Log4J desde un archivo accesible via CLASSPATH
		DOMConfigurator.configure(EjemploLog.class.getClassLoader().getResource("autentialog4jTutorial.xml"));
		
		// Obtenemos el Log para esta clase.
		Log log = LogFactory.getLog(EjemploLog.class);
		
		// Por motivos de eficiencia, siempre se debería preguntar si está activado el log para este nivel.
		if (log.isDebugEnabled()){
			log.debug("Salida DEBUG desde la clase EjemploLog");
		}
		
		log.error("Salida ERROR desde la clase EjemploLog");
		
		// Instanciamos los objetos necesarios para este ejemplo
		new com.autentia.tutoriales.log4j.paquete1.Clase1();
		new com.autentia.tutoriales.log4j.paquete2.Clase2();
	}
}

En el paquete com.autentia.tutoriales.log4j.paquete1, agruparíamos las clases con una determinada funcionalidad.

package com.autentia.tutoriales.log4j.paquete1;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * Ejemplo del tutorial 
 * @author Carlos García. Autentia.
 * @see http://www.mobiletest.es
 */
public class Clase1 {
	
	private Log log;
	
	public Clase1(){
		log = LogFactory.getLog(this.getClass());
		if (log.isDebugEnabled()){
			log.debug("Salida debug desde la clase 1");
		}
		log.error("Salida error desde la clase 1");
	}
}

En el paquete com.autentia.tutoriales.log4j.paquete2, agruparíamos las clases con una determinada funcionalidad.

package com.autentia.tutoriales.log4j.paquete2;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * Ejemplo del tutorial 
 * @author Carlos García. Autentia.
 * @see http://www.mobiletest.es
 */
public class Clase2 {
	private Log log;
	
	public Clase2(){
		log = LogFactory.getLog(this.getClass());
		if (log.isDebugEnabled()){
			log.debug("Salida debug desde la clase 2");
		}
		log.error("Salida error desde la clase 2");
	}
}

Archivo de configuración de Log4j: autentiaLog4jTutorial.xml




	
		
			
		
	

	
		
		
		
		

		
			
		
	

	
		
		
		

		
			
		
	

	
		
		
		
		

		
			
		
	
	
	
		
		
		
		

		
			
		
	

	
		
		
		
	

	
		
		
	
	

	
		
	

	
		
	

tuApplicationName.log:

2008-02-10 12:01:35 [DEBUG] [com.autentia.tutoriales.log4j.EjemploLog.main(EjemploLog.java:25)] 
Salida DEBUG desde la clase EjemploLog

2008-02-10 12:01:35 [ERROR] [com.autentia.tutoriales.log4j.EjemploLog.main(EjemploLog.java:28)] 
Salida ERROR desde la clase EjemploLog

2008-02-10 12:01:35 [DEBUG] [com.autentia.tutoriales.log4j.paquete1.Clase1.(Clase1.java:18)] 
Salida debug desde la clase 1

2008-02-10 12:01:35 [ERROR] [com.autentia.tutoriales.log4j.paquete1.Clase1.(Clase1.java:20)] 
Salida error desde la clase 1

2008-02-10 12:01:35 [DEBUG] [com.autentia.tutoriales.log4j.paquete2.Clase2.(Clase2.java:17)] 
Salida debug desde la clase 2

2008-02-10 12:01:35 [ERROR] [com.autentia.tutoriales.log4j.paquete2.Clase2.(Clase2.java:19)] 
Salida error desde la clase 2

tuApplicationNameErrorFile.log

2008-02-10 12:01:35 [ERROR] [com.autentia.tutoriales.log4j.EjemploLog.main(EjemploLog.java:28)] 
Salida ERROR desde la clase EjemploLog

2008-02-10 12:01:35 [ERROR] [com.autentia.tutoriales.log4j.paquete1.Clase1.(Clase1.java:20)] 
Salida error desde la clase 1

2008-02-10 12:01:35 [ERROR] [com.autentia.tutoriales.log4j.paquete2.Clase2.(Clase2.java:19)] 
Salida error desde la clase 2

tuApplicationNameErrorFile1.log

2008-02-10 12:01:35 [ERROR] [com.autentia.tutoriales.log4j.paquete1.Clase1.(Clase1.java:20)] 
Salida error desde la clase 1

tuApplicationNameErrorFile2.log

2008-02-10 12:01:35 [ERROR] [com.autentia.tutoriales.log4j.paquete2.Clase2.(Clase2.java:19)] 
Salida error desde la clase 2

Conclusiones

La gestión de trazas es una parte fundamental de toda aplicación, por lo que es recomendable establecer alguna política o pautas al respecto dentro del proyecto.

Recordar que la mayor parte del dinero de un sistema informático se va en mantenimientos, así que un buen sistema de logs nos hará la vida más fácil y nos permitirá ahorrar muchos esfuerzos (dinerito).

Carlos García Pérez. Creador de MobileTest, un complemento educativo para los profesores y sus alumnos.

cgpcosmad@gmail.com

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad