Log4j

RECU-0226 (Recurso Ficha Técnica)

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:

TipoDefinición
DEBUGSe utiliza para mensajes de depuración habitualmente esta desconectado cuando la aplicación esta en producción.
INFOSe utiliza para mensajes de información.
WARNSe utiliza para enviar avisos sobre eventos de los que se desea mantener constancia pero que no afectan al correcto funcionamiento del sistema.
ERRORSe utiliza para grabar mensajes de error, aunque afectan al programa dejan seguir el funcionamiento del mismo.
FATALSe utiliza para mensajes críticos del sistema, normalmente, después de almacenar el mensaje, el sistema abortará la ejecución.
Como norma general el nivel de traza indicado en el fichero de configuración de log4j debe ser el más bajo posible, que se adecúe a las necesidades de la aplicación. En caso de realizar un seguimiento a un nivel muy bajo, la ejecución de las aplicaciones se puede ralentizar, y el log se convertiría en ilegible. Por tanto en tiempo de pruebas o desarrollo se puede utilizar el nivel más bajo de log, DEBUG, pero una vez la aplicación se encuentre en un entorno de producción se recomienda utilizar solo el nivel ERROR o WARN.

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
ConsoleAppenderDespliega el log en la consola
FileAppenderRedirecciona 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
DailyRollingFileAppenderRedirecciona 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 mas 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