Log4j
- Área: Librerías y Utilidades para Aplicaciones Java
- Carácter del recurso: Recomendado
Descripción
Introducción
Es una librería de código abierto desarrollada en Java por la Apache Software Foundation que permite a los desarrolladores de software elegir la salida y el nivel de granularidad de los mensajes o logs en tiempo de ejecución y no en tiempo de compilación como se realizaba comúnmente.
Las responsabilidades de este componente son:
- Definir las acciones a registrar
- Definir para cada una de las acciones registradas el nivel de evento.
- Definir las salidas y formato del log
La primera ventaja que ofrece, cualquier API de logging con respecto al sistema tradicional es la categorización de varios tipos de logs, permitiendo que estén o no habilitados en función de decisiones del programador.Log4j tiene tres componentes principales Logger, Appender y Layout. Estos tres componentes trabajan juntos para permitir a los desarrolladores generar mensajes según las acciones y niveles de los eventos, además de controlar el formato y almacenamiento de estos mensajes. Log4j, presenta cinco niveles de prioridad para los mensajes que se estructuran de la siguiente manera:
Tipo | Definición |
---|---|
DEBUG | Se utiliza para mensajes de depuración habitualmente esta desconectado cuando la aplicación esta en producción. |
INFO | Se utiliza para mensajes de información. |
WARN | Se utiliza para enviar avisos sobre eventos de los que se desea mantener constancia pero que no afectan al correcto funcionamiento del sistema. |
ERROR | Se utiliza para grabar mensajes de error, aunque afectan al programa dejan seguir el funcionamiento del mismo. |
FATAL | Se utiliza para mensajes críticos del sistema, normalmente, después de almacenar el mensaje, el sistema abortará la ejecución. |
Otra de las posibilidades de Log4j es poder imprimir los mensajes en múltiples destinos , en Log4j el destino de salida se denomina "Appender" . A continuación ofrecemos los "appenders" mas utiles:
Appender | Descripción |
---|---|
ConsoleAppender | Despliega el log en la consola |
FileAppender | Redirecciona el log a un fichero |
RollingFileAppender | Redirecciona un archivo con política de rotación para que no se dispare el tamaño del archivo |
DailyRollingFileAppender | Redirecciona un archivo con política de rotación basadas en la fecha |
SocketAppender | Redirecciona los mensajes a un servidor remoto de log |
SMTPAppender | Envía por mail los logs |
JDBCAppender | Redirecciona los mensajes de log a una base de datos |
SyslogAppender | Redirecciona el log a un demonio remoto syslog en Unix |
NTEventlogAppender | Redirecciona el log hacia el log del sistema NT |
JMSAppender | Serializa los eventos y los transmite como un mensaje tipo JMS |
Existe una capa de Layout que permite al desarrollador definir el formato de los mensajes que se envían por el log. A continuación se comentan los layouts mas importantes:
Layout | Descripción |
---|---|
SimpleLayout | Muy básico, consiste en la prioridad del mensaje seguido del contenido del mismo |
PatternLayout | Especifica el formato de salida en función de unos patrones de salida similares a los aplicados en la función "printf" del lenguaje C. |
XMLLayout | Especifica que la salida será en un fichero XML |
HTMLLayout | Especifica que la salida será en una tabla HTML |
TTCCLayaout | Muestra la fecha, categoría , hilo y el mensaje |
Usos y Ventajas conocidas
- Utilizado en la generación de trazas por JBoss
- Aplicaciones comerciales (ejemplo REGAC)
- Framework Principado de Asturias OPENFWPA
Ejemplo de uso
En el siguiente ejemplo la clase MyApp primero importa las clases relacionadas de log4j, luego define una variable estática de tipo Logger con el nombre de la clase MyApp.class y finalmente invoca al método BasicConfigurator.configure que crea una configuración de log4j con un ConsoleAppender y define el PatternLayout a "%-4r %t %-5p %c %x - %m%n".
import com.foo.Bar;
// Importa las clases de log4j.
import org.apache.log4j.Logger;
import org.apache.log4j.BasicConfigurator;
public class MyApp {
// Define una variable estática que tiene una referencia
// a una instancia de Logger llamada "MyApp".
static Logger logger = Logger.getLogger(MyApp.class);
public static void main(String[] args) {
// Crea una simple configuración a la consola
BasicConfigurator.configure();
logger.info("Entrando en la aplicación.");
Bar bar = new Bar();
bar.doIt();
logger.info("Saliendo de la aplicación.");
}
}
MyApp utiliza la clase Bar del paquete com.foo, la cual ya no tiene que configurar el log sino únicamente utilizarlo.
package com.foo;
import org.apache.log4j.Logger;
public class Bar {
static Logger logger = Logger.getLogger(Bar.class);
public void doIt() {
logger.debug("Dentro de Bar!");
}
}
La salida en el log sería:
0 [main] INFO MyApp - Entrando en la aplicación.
36 [main] DEBUG com.foo.Bar - Dentro de Bar!
51 [main] INFO MyApp - Saliendo de la aplicación.
Requisitos e incompatibilidades
- log4j-1.2.14.jar debe de estar incluido en el classpath de la aplicación
- log4j.properties debe de estar incluido en el classpath de la aplicación