Imprimir

La clase Logger de Java permite crear mensajes para el seguimiento o registro de la ejecución de una aplicación. Puede resultar de utilidad, por ejemplo, para realizar la depuración de la aplicación si se muestran los distintos puntos o estados por lo que va pasando la ejecución con los valores tomados por variables de interés.

Este tipo de mensajes se pueden obtener también con la instrucción System.out.println() para mostrar mensajes en la salida estándar, pero esta clase Logger ofrece la ventaja de poder emitir la salida también en archivos con diferentes formatos (XML, TXT, HTML, etc).

Obtener el objeto Logger de la clase

Esta clase no ofrece un método constructor, por lo que se debe usar el método estático getLogger() que permite obtener un objeto Logger relacionado con el nombre que se asigne como parámetro.

static Logger getLogger(String name)

El nombre (name) que se asigna por parámetro será normalmente la clase en la que se esté utilizando el Logger precedida con puntos del nombre del paquete en el que se encuentre, por ejemplo: "paquete.NombreClase". Este String se puede indicar de manera literal o usando una llamada a NombreClase.class.getName(), sustituyendo NombreClase por el nombre correspondiente a la clase en la que se está haciendo uso del Logger. Así, la obtención del objeto Logger de la clase NombreClase podría ser:

Logger.getLogger("paquete.NombreClase")

Este objeto retornado por getLogger() puedes almacenarlo en una constante dentro de la clase, o bien volver a obtenerlo cada vez que sea necesario.

final Logger LOG = Logger.getLogger("paquete.NombreClase");

De esa manera, para hacer una llamada a un método de Logger, puedes realizarlo de varias maneras posibles:

//Usando la constante creada anteriormente
LOG.log(________);
//O tomando cada vez el objeto con getLogger()
Logger.getLogger("paquete.NombreClase").log(________);
//O recogiendo el nombre completo de la clase con getName()
Logger.getLogger(NombreClase.class.getName()).log(________);

Si usas NetBeans como entorno de desarrollo, puedes crear de manera automática la declaración de una constante para Logger usando el menú Source > Insert Code > Logger.

Niveles de importancia de los mensajes

Cada mensaje generado con la clase Logger debe tener asignado un nivel de importancia a elegir entre los siguientes, ordenador de mayor importancia a menos:

Para establecer estos niveles se debe usar la clase Level de Java, que ofrece una serie de constantes estáticas relacionadas con estos niveles: Level.SEVERE, Level.WARNING, etc.

Generar mensajes

La clase Logger ofrece el método log() para poder generar los mensajes de registro. El formato más sencillo es:

void log(Level level, String msg)

Donde se debe indicar como primer parámetro el nivel de importancia del mensaje usando las constantes comentadas anteriormente, y como segundo parámetro el mensaje en sí.

Un ejemplo se uso podría ser:

LOG.log(Level.SEVERE, "Se ha producido un error");

Aunque la misma clase dispone de un método para generar mensajes con cada uno de los niveles. Con estos métodos tan sólo hay que indicar el mensaje.

void severe(String msg)

void warning(String msg)

void info(String msg)

void config(String msg)

void fine(String msg)

void finer(String msg)

void finest(String msg)

De esa manera, el ejemplo anterior es equivalente a:

LOG.severe("Se ha producido un error");

En la siguiente imagen puedes ver el resultado que se obtiene en la ejecución de la línea anterior. Puedes comprobar que se muestra, además del mensaje, información sobre la fecha y hora en que se ha producido y el nivel del mensaje.

logger01

Filtro por niveles de importancia

Por defecto, el nivel más bajo de importancia de los mensajes que se registran es INFO, por lo que los mensajes de importancia menor no se mostrarán a no ser que se modifique el nivel más bajo.

Para modificar el nivel a partir del cual se registrarán los mensajes se debe usar el método setLevel():

void setLevel(Level newLevel)

A este método se le debe pasar por parámetro el nivel más bajo a registrar. Para esto se dispone además de cada uno de los niveles, las constantes Level.OFF y Level.ALL para no registrar ningún mensaje o registrarlos todos respectivamente. Por ejemplo, si se desean registrar los mensajes que al menos tengan una importancia de FINE se debe ejecutar (se está suponiendo que se ha creado previamente la constante LOGGER con el Logger de la clase):

LOG.setLevel(Level.FINE);

Esto es de utilidad para establecer un nivel bajo de registro de mensajes mientras la aplicación está en proceso de desarrollo para hacer un seguimiento detallado de depuración. Cuando la aplicación se publique, se deberá cambiar el nivel de registro, para generar sólo los mensajes que realmente sean importantes.

Salida de mensajes en archivos

Los mensajes de Logger parecen por defecto en la salida estándar, pero es posible almacenar dichos mensajes en archivos para que puedan ser analizados posteriormente a la ejecución de la aplicación.

Para ello, se usará el método addHandler, de la clase Logger, que permite añadir nuevos manipuladores de los mensajes, como puede ser un archivo.

void addHandler(Handler handler)

Como parámetro se debe indicar un objeto de tipo Handler que son manipuladores en los que se puede obtener el resultado de este tipo de mensajes. Algunos tipos de manipuladores que podemos usar son:

Si se utiliza un objeto FileHandler como Handler del Logger, se generará por defecto un archivo de tipo XML con el contenido de los mensajes. Esto puedes hacerlo con un código similar al siguiente, donde se genera el archivo Logging.xml:

FileHandler fileXml = new FileHandler("Logging.xml");
LOG.addHandler(fileXml);

El fichero XML que se obtiene tiene un contenido como el siguiente:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
  <date>2013-12-12T16:50:35</date>
  <millis>1386863435913</millis>
  <sequence>0</sequence>
  <logger>pruebaslogger.PruebasLogger</logger>
  <level>SEVERE</level>
  <class>pruebaslogger.PruebasLogger</class>
  <method>main</method>
  <thread>1</thread>
  <message>Se ha producido un error</message>
</record>
</log>

Si en lugar de obtener un archivo con contenido XML quieres almacenar los mensajes en un documento de texto plano, deberás asignarle un Formatter de tipo SimpleFormatter al objeto Handler. Puedes hacerlo de manera similar a esta:

FileHandler fileTxt = new FileHandler("Logging.txt");
SimpleFormatter formatterTxt = new SimpleFormatter();
fileTxt.setFormatter(formatterTxt);
LOG.addHandler(fileTxt);

El fichero de texto resultante tendrá un contenido como el siguiente:

dic 12, 2013 4:58:15 PM pruebaslogger.PruebasLogger main
SEVERE: Se ha producido un error

Configuración en archivo logging.properties de Java

También se pueden establecer las configuraciones de los niveles mínimos de importancia que se mostrarán y el formato de salida de los mismos, en el archivo logging.properties que se encuentra en la carpeta lib donde se encuentre instalado el JRE utilizado para ejecutar la aplicación.

Puedes conocer la ruta en la que se encuentra instalado el JRE que se está usando para ejecutar tu aplicación si muestras la salida de la orden:

System.getProperty("java.home")

En el siguiente vídeo puedes ver un ejemplo completo de utilización de Logger y la configuración de dicho archivo.