jueves, 18 de agosto de 2011

Log4j

Es un API  que permite a los desarrolladores loguear todo lo que pasa en una aplicacion.
Por defecto Log4J tiene 6 niveles de prioridad para los mensajes (trace, debug, info, warn, error, fatal).

En Log4J los mensajes o logs son enviados a una o varias salida/s de destino, lo que se denomina un appender. Generalmente la salida de los mensajes es redirigida a la consola o bien un fichero de texto .log (FileAppender, RollingFileAppender). Los logs pueden ser formateados (SimpleLayout y PatternLayout)

La API es totalmente configurable, generalmente mediante un archivo llamado log4j.properties.
A continuación mostraremos un ejemplo de un fichero properties de configuración (log4j.properties), y configuraremos dos appenders (CONSOLE y LOGFILE) con un nivel de prioridad de DEBUG:

  • CONSOLE appender que imprimirá los mensajes en la consola por líneas
  • LOGFILE appender que añadirá (append) los mensajes a un fichero (keystorereader.log)
  • DEBUG: nivel de prioridad que se utiliza para escribir mensajes de depuración. Este nivel no debe estar activado cuando la aplicación se encuentre en producción.

log4j.properties


################################################################
############ Configuración del log4j.properties ################
################################################################
log4j.rootCategory=DEBUG, CONSOLE, LOGFILE 


# Appender CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d %-5p %c %x - %m%n 


# Appender LOGFILE
log4j.appender.LOGFILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.LOGFILE.file=c\:\\keystorereader.log
log4j.appender.LOGFILE.append=true
log4j.appender.LOGFILE.DatePattern='.'yyyy-MM-dd
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d %-4r [%t] %-5p %c - %m%n

Para empezar a utilizar Log4j en cualquier clase java (previo de incorporar al proyecto, la librería de log4j, por ejemplo la versión 1.2.16 - log4j-1.2.16.jar) solo debemos agregar la siguiente linea de código:

private final static Logger log = Logger.getLogger(KeyStoreReader.class);


Varios arhivos de logs

En caso que querramos separar los arhivos de logs en varios (tener mas de un archivo de logs), lo podemos encontrar en:

http://chuwiki.chuidiang.org/index.php?title=Separar_el_log_en_varios_ficheros


Loggers y varios arhivos de logs por paquete

En un mismo archivo log4j.properties se pueden configurar distintos Loggers lo cual nos permitiría activar o desactivar los mensajes en base al paquete (package) o clase en la que se utilice el logger.

De esta forma si especificamos en el archivo de configuración las siguientes opciones: 

log4j.rootCategory=INFO, CONSOLE, LOGFILE
log4j.logger.orange.task.report=DEBUG, LOGFILE_REPORT

Estamos indicando que tendremos un Logger "genérico" (el rootLogger) el cual funcionara para todas las clases y guardara los mensajes con el nivel INFO, mandando la salida al appender LOGFILE y adicionalmente tendremos un logger custom con su propio appender para el paquete orange.task.report  el cual mandara todos los mensajes con Nivel de DEBUG al appender LOGFILE_REPORT.

Ejemplo con dos loggers (donde mandamos mensajes de logs a dos archivos de logs diferentes)

################################################################
############ Configuración del log4j.properties ################
################################################################
log4j.rootCategory=INFO, CONSOLE, LOGFILE

log4j.logger.orange.task.report=INFO, LOGFILE_REPORT

# Appender CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d %-5p %c %x - %m%n 

# Appender LOGFILE
log4j.appender.LOGFILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.LOGFILE.file=c\:\\inventarioToCTBit.log
log4j.appender.LOGFILE.append=true
log4j.appender.LOGFILE.DatePattern='.'yyyy-MM-dd
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d %-4r [%t] %-5p %c - %m%n

# Appender LOGFILE_REPORT
log4j.appender.LOGFILE_REPORT=org.apache.log4j.DailyRollingFileAppender
log4j.appender.LOGFILE_REPORT.file=c\:\\report.log
log4j.appender.LOGFILE_REPORT.append=true
log4j.appender.LOGFILE_REPORT.DatePattern='.'yyyy-MM-dd
log4j.appender.LOGFILE_REPORT.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE_REPORT.layout.ConversionPattern=%d %-4r [%t] %-5p %c - %m%n


Loggers y varios arhivos de logs por logger (dentro de una misma clase)


http://adeideas.com/paquito/archives/161/Manual_corto_Log4j.htm


Ejemplo con dos loggers customs (donde mandamos mensajes de logs a dos archivos de logs diferentes) donde podremos instanciarlos en la clase java para poder utilizarlos

################################################################
############ Configuración del log4j.properties ################
################################################################
log4j.rootCategory=INFO, CONSOLE, LOGFILE

log4j.logger.pepe1=INFO, LOGFILE_REPORT_1
log4j.logger.pepe2=INFO, LOGFILE_REPORT_2

# Appender1 CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d %-5p %c %x - %m%n 

# Appender2 LOGFILE
log4j.appender.LOGFILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.LOGFILE.file=c\:\\inventarioToCTBit.log
log4j.appender.LOGFILE.append=true
log4j.appender.LOGFILE.DatePattern='.'yyyy-MM-dd
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d %-4r [%t] %-5p %c - %m%n

# Appender3 LOGFILE_REPORT_1
log4j.appender.LOGFILE_REPORT=org.apache.log4j.DailyRollingFileAppender
log4j.appender.LOGFILE_REPORT.file=c\:\\report_1.log
log4j.appender.LOGFILE_REPORT.append=true
log4j.appender.LOGFILE_REPORT.DatePattern='.'yyyy-MM-dd
log4j.appender.LOGFILE_REPORT.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE_REPORT.layout.ConversionPattern=%d %-4r [%t] %-5p %c - %m%n



# Appender4 LOGFILE_REPORT_2
log4j.appender.LOGFILE_REPORT=org.apache.log4j.DailyRollingFileAppender
log4j.appender.LOGFILE_REPORT.file=c\:\\report_2.log
log4j.appender.LOGFILE_REPORT.append=true
log4j.appender.LOGFILE_REPORT.DatePattern='.'yyyy-MM-dd
log4j.appender.LOGFILE_REPORT.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE_REPORT.layout.ConversionPattern=%d %-4r [%t] %-5p %c - %m%n

Y luego lo invocamos desde JAVA mediante la siguiente linea:

private static final Logger logger1 = Logger.getLogger("pepe1");
private static final Logger logger2 = Logger.getLogger("pepe2");


Y luego utilizamos el logger1 o logger2 de acuerdo a lo que queremos loguear en cada archivo (report_1.log y report_2.log)


No hay comentarios:

Publicar un comentario