Log4j

RECU-0226 (Recurso Ficha Técnica)

Descripció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

Una 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" más útiles:

AppenderDescripción
ConsoleAppenderDespliega el log en la consola
FileAppenderRedirecciona el log a un fichero
RollingFileAppenderRedirecciona a un archivo con política de rotación para que no se dispare el tamaño del archivo
DailyRollingFileAppenderRedirecciona a un archivo con política de rotación basadas en la fecha
SocketAppenderRedirecciona los mensajes a un servidor remoto de log
SMTPAppenderEnvía por mail los logs
JDBCAppenderRedirecciona los mensajes de log a una base de datos
SyslogAppenderRedirecciona el log a un demonio remoto syslog en Unix
NTEventlogAppenderRedirecciona el log hacia el log del sistema NT
JMSAppenderSerializa 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 más importantes:

LayoutDescripción
SimpleLayoutMuy básico, consiste en la prioridad del mensaje seguido del contenido del mismo
PatternLayoutEspecifica el formato de salida en función de unos patrones de salida similares a los aplicados en la función "printf" del lenguaje C.
XMLLayoutEspecifica que la salida será en un fichero XML
HTMLLayoutEspecifica que la salida será en una tabla HTML
TTCCLayaoutMuestra la fecha, categoría, hilo y el mensaje
Para servidores de aplicaciones en producción y, en general, para tareas multihilo se recomienda incluir el parámetro %t para poder seguir la ejecución de un hilo concreto.

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

Enlaces externos

Contenidos relacionados

Pautas
Área: Desarrollo » Librerías y Módulos » Java
Código Título Tipo Carácter
LIBP-0344 Librerías para aplicaciones Java Libro de pautas Directriz Recomendada
Recursos