Log4j es una biblioteca open source desarrollada en Java por la Apache Software Foundation que permite a los desarrolladores de software escribir mensajes de registro, cuyo propósito es dejar constancia de una determinada transacción en tiempo de ejecución.
En este post aprenderemos a configurar y a utilizar la librería log4j para mostrar los mensajes "trace, debug, info, warn, error, fatal" en nuestra aplicación, Mostraremos esos mensajes por pantalla (consola) y también lo guardaremos en un archivo de texto y en una tabla de base de datos.
Utilizaremos un objeto de propiedades llamado GeneralParams.properties que contendrá en sus propiedades el archivo que guardará la configuración del Log de la aplicación. Este un modelo muy utilizados en proyectos de empresas ya que normalmente todo esta parametrizado en archivos de propiedades o tablas de base de datos; y es bueno saber como podemos cargar, inicializar y obtener los valores de estas propiedades desde nuestras clases java.
Utilizaremos un objeto de propiedades llamado GeneralParams.properties que contendrá en sus propiedades el archivo que guardará la configuración del Log de la aplicación. Este un modelo muy utilizados en proyectos de empresas ya que normalmente todo esta parametrizado en archivos de propiedades o tablas de base de datos; y es bueno saber como podemos cargar, inicializar y obtener los valores de estas propiedades desde nuestras clases java.
Pasos
CONFIGURACIÓN
1. Creamos un Java Project y agregamos las librerías de conexión MySQL y log4j.
Para agregar las librerías debemos hacer clic derecho al proyecto y seleccionar la opción properties. En la ventana que aparece debemos ir a la opción Java Build Path/Libraries. Una vez ahí, debemos agregar los jars que vamos a necesitar.
2. Creamos un archivo llamado GeneralParams.properties en la raiz del proyecto java.
1 2 | modulo=Aprendec LogConfigFile=/com/aprendec/config/log4j.properties |
3. Creamos la siguiente base de datos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Create Database Log4j; Use Log4j; Create Table Log ( DatetimeIns DATETIME NULL , Categoria VARCHAR (100) NULL , Modulo VARCHAR (100) NULL , Clase VARCHAR (100) NULL , Metodo VARCHAR (100) NULL , Linea VARCHAR (100) NULL , Mensaje VARCHAR (100) ); select * from Log; |
4. Creamos un archivo llamado log4j.properties dentro del paquete com.aprendec.config.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | ### Root logger: Afecta a todos los Logger #log4j.rootCategory=ALL, ARCHIVO ### Si queremos mostrar todos los mensajes (trace, debug, info, warn, error, fatal) para las clases del paquete 'com.aprendec' en consola, archivo y base de datos #log4j.logger.com.aprendec=ALL, CONSOLA, ARCHIVO, BD ### Si queremos mostrar solo los mensajes del nivel INFO hacia adelante (info, warn, error, fatal) para las clases del paquete 'com.aprendec' en consola, archivo y base de datos #log4j.logger.com.aprendec=DEBUG, CONSOLA, ARCHIVO, BD ### Si queremos mostrar todos los mensajes (trace, debug, info, warn, error, fatal) en consola, archivo y base de datos log4j.logger.Aprendec=ALL, CONSOLA, ARCHIVO, BD ### si queremos que no se haga el append #log4j.appender.LOGFILE.Append=false ################################################## ### Para dirigir mensajes a la salida estandar ### ################################################## log4j.appender.CONSOLA=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLA.Target=System.out log4j.appender.CONSOLA.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLA.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n ########################################## ### Para dirigir mensajes a un archivo ### ########################################## log4j.appender.ARCHIVO=org.apache.log4j.DailyRollingFileAppender #log4j.appender.ARCHIVO.File=c:/sample.log log4j.appender.ARCHIVO.File=sample.log log4j.appender.ARCHIVO.MaxFileSize=10000KB log4j.appender.ARCHIVO.DatePattern='.'yyyy-MM-dd'.log' log4j.appender.ARCHIVO.layout=org.apache.log4j.PatternLayout log4j.appender.ARCHIVO.layout.ConversionPattern=%d %-4r [%t] %-5p %c %x - %m%n ################################################# ### Para dirigir mensajes a una base de datos ### ################################################# log4j.appender.BD=org.apache.log4j.jdbc.JDBCAppender log4j.appender.BD.Driver=com.mysql.cj.jdbc.Driver log4j.appender.BD.URL=jdbc:mysql://localhost:3306/Log4j?useTimezone=true&serverTimezone=UTC log4j.appender.BD.user=root log4j.appender.BD.password=root log4j.appender.BD.layout=org.apache.log4j.PatternLayout log4j.appender.BD.sql=INSERT INTO Log (DatetimeIns, Categoria, Modulo, Clase, Metodo, Linea, Mensaje) VALUES(sysdate(),'%5p','%c{1}','%C{1}','%M',%L,'%m') |
5. Creamos una clase llamada GeneralUtil.java dentro del paquete com.aprendec.util.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | package com.aprendec.util; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class GeneralUtil { private static Properties prop = null ; private static Properties propLog = null ; // Este método se encarga de leer las propiedades del archivo "GeneralParams.properties" public static String getProperty(String key) { if (prop == null ) { prop = getPropertyFile(); } return prop.getProperty(key); } // Este método se encarga de cargar el objeto de propiedades "GeneralParams.properties" private static Properties getPropertyFile() { // InputStream is = null; try { // is = new FileInputStream("E:\Disco E\Workspace\Workspace indigo\TEST\Log4j\src\GeneralParams.properties"); // prop.load(is); prop = new Properties(); prop.load(GeneralUtil. class .getResourceAsStream( "/GeneralParams.properties" )); return prop; } catch (IOException ioe) { ioe.printStackTrace(); return null ; } } // Este método se encarga de cargar el objeto de propiedades "log4j.properties" public static Properties getPropertyFile(String property) { /* * Valida si el properties es nulo. En ese caso, lee del parámetro, sino retorna * el properties ya leido */ if (propLog == null ) { // lo obtiene en un is para poder validarlo InputStream is = GeneralUtil. class .getResourceAsStream(property); propLog = new Properties(); if (is != null ) { // si lo encontró muestra un mensaje en syso (ya que este prop esta antes del log) try { propLog.load(is); } catch (IOException ex) { System.out.println( "ERROR: *** " + ex.getMessage()); } } else { // sino lanza una excepcion e imprime una local System.out.println( "ERROR: *** " + property + " no cargo***" ); } } return propLog; } } |
6. Creamos una clase llamada Log.java dentro del paquete com.aprendec.util.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package com.aprendec.util; import java.io.PrintWriter; import java.io.StringWriter; import org.apache.log4j.Logger; public class Log { public static final Logger logger = Logger.getLogger(GeneralUtil.getProperty( "modulo" )); public static String getStackTrace(Exception e) { StringWriter sWriter = new StringWriter(); PrintWriter pWriter = new PrintWriter(sWriter); e.printStackTrace(pWriter); return sWriter.toString(); } } |
Probar aplicación
7. Creamos la clase Demo1.java dentro del paquete com.aprendec.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | package com.aprendec; import org.apache.log4j.BasicConfigurator; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; public class Demo1 { private final static Logger log = Logger.getLogger(Demo1. class ); public static void main(String[] args) { // modo1(); modo2(); } // Configuración básica static void modo1() { System.out.println( "*** Configuración básica ***" ); BasicConfigurator.configure(); log.trace( "un trace" ); log.debug( "un debug" ); log.info( "un info" ); log.warn( "un warning" ); log.error( "un error" ); log.fatal( "un fatal" ); } // Usando archivo externo static void modo2() { System.out.println( "*** Usando archivo externo ***" ); // Nombre del archivo que guarda la configuración del Log de la aplicación PropertyConfigurator.configure( "C:\\log4j.properties" ); log.trace( "un trace" ); log.debug( "un debug" ); log.info( "un info" ); log.warn( "un warning" ); log.error( "un error" ); log.fatal( "un fatal" ); } } |
8. Creamos la clase Demo2.java dentro del paquete com.aprendec.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | package com.aprendec; import java.util.Properties; import org.apache.log4j.PropertyConfigurator; import com.aprendec.util.GeneralUtil; import com.aprendec.util.Log; public class Demo2 { public static void main(String[] args) { inicializar(); sumar( 2 , 3 ); } static void inicializar() { try { // PropertyConfigurator.configure("E:\Disco E\Workspace\Workspace indigo\TEST\Log4j\src\com\aprendec\config\log4j.properties"); // PropertyConfigurator.configure("C:\\log4j.properties"); // Este es el archivo que guarda la configuración del Log de la aplicación (/com/aprendec/config/log4j.properties) String relativePath = GeneralUtil.getProperty( "LogConfigFile" ); // Obtiene las propiedades del archivo que guarda la configuración del Log de la aplicación Properties properties = GeneralUtil.getPropertyFile(relativePath); // Configuramos el logger desde el archivo de propiedades PropertyConfigurator.configure(properties); System.out.println( "*** Sistema levantado ***" ); } catch (Throwable t) { System.out.println( "*** Error al inicializar el sistema ***" ); t.printStackTrace(); } } static void sumar( int num1, int num2) { Log.logger.trace( "Este es un trace: " + num1 + num2); Log.logger.debug( "Este es un debug: " + num1 + num2); Log.logger.info( "Este es un info: " + num1 + num2); Log.logger.warn( "Este es un warning: " + num1 + num2); Log.logger.error( "Este es un error: " + num1 + num2); Log.logger.fatal( "Este es un fatal: " + num1 + num2); } } |
Estructura del proyecto
CONSOLA
ARCHIVO DE TEXTO
BASE DE DATOS
Descargar proyecto
No hay comentarios, ¡cuéntame algo!
Me gustaría saber tu opinión. ¡Saludos!