Durante un tiempo me sentí estancado con Java, sobre todo cuando me tocó registrar y categorizar mensajes de log, porque en serio era como tratar de organizar una biblioteca desordenada. Como hay tantos detalles que manejar y muchas formas de hacerlo, la mayoría de las veces terminaba con más preguntas que respuestas. Por suerte, aprendí a usar java.util.logging.Logger y las cosas cambiaron del cielo a la tierra, porque al fin pude gestionar diferentes niveles de log en Java de manera sencilla y clara. Entonces, te preparé esta guía con la que aprenderás a usar esta herramienta.
¿Qué es java.util.logging.Logger?
Esta herramienta es como un organizador de eventos, de esos que contratas para que todo salga excelente en una fiesta. Por lo general, esos organizadores llevan una agenda donde anotan cada detalle importante de la fiesta: cuándo llegan los invitados o si hay problemas con la comida.
Entonces, java.util.logging.Logger (el organizador de eventos) te ayuda a registrar (o “loggear”) eventos importantes en tu aplicación, como mensajes de errores, advertencias, o simplemente información para seguimiento y a categorizarlos en niveles que indican su severidad o propósito.
Además de esto, también te deja ver el flujo de tu aplicación para que puedas detectar si algo está saliendo mal. Algo grandioso es que sabrás sobre el comportamiento de tu aplicación en tiempo real o en retrospectiva, como mejor se ajuste a tus necesidades.
Recuerda que java.util.logging.Logger también mantiene un registro de todas aquellas actividades importantes que se llevarán a cabo en tu aplicación.
Niveles de log: el “semáforo” de la información
Es muy importante que tengas claro que java.util.logging.Logger de Java define siete niveles estándar:
- SEVERE: Para errores críticos que podrían detener la aplicación.
- WARNING: Advertencias de posibles problemas.
- INFO: Información general sobre el estado de la aplicación.
- CONFIG: Datos de configuración de la aplicación.
- FINE, FINER, FINEST: Detalles técnicos útiles para depuración.
Además, tienes los niveles OFF (apaga todos los logs) y ALL (registra absolutamente todo). Piensa en estos niveles como los colores en un semáforo: cada uno indica la urgencia y el tipo de acción que debes tomar.
Observa con detenimiento este primer ejemplo que te pongo aquí:
import java.util.logging.Level;
import java.util.logging.Logger;
public class LogExample {
private static final Logger logger = Logger.getLogger(LogExample.class.getName());
public static void main(String[] args) {
logger.setLevel(Level.INFO);
logger.severe("Esto es un error crítico.");
logger.warning("Esto es una advertencia.");
logger.info("Mensaje informativo.");
logger.fine("Detalles técnicos.");
}
}
En este ejemplo, los mensajes con nivel INFO o superior se imprimirán, mientras que los niveles inferiores, como FINE, serán ignorados.
Handlers: el “cartero” del log
Un handler es como un cartero que entrega los mensajes de log. Los dos principales que ofrece Java son:
- ConsoleHandler: Envía los logs a la consola.
- FileHandler: Almacena los logs en un archivo XML.
Por ejemplo, para escribir logs en un archivo, podrías usar un FileHandler:
import java.io.IOException;
import java.util.logging.*;
public class FileLogExample {
private static final Logger logger = Logger.getLogger(FileLogExample.class.getName());
public static void main(String[] args) throws IOException {
FileHandler fileHandler = new FileHandler("logs.xml");
logger.addHandler(fileHandler);
logger.warning("Log escrito en archivo.");
}
}
Formateadores: personalizando el mensaje
Los logs no tienen por qué ser aburridos. Puedes usar formateadores como SimpleFormatter o XMLFormatter para definir cómo se verán tus mensajes. Incluso puedes crear tu propio formateador:
import java.util.logging.*;
public class CustomFormatter extends Formatter {
@Override
public String format(LogRecord record) {
return record.getLevel() + "::" + record.getMessage() + "\n";
}
}
public class FormatterExample {
private static final Logger logger = Logger.getLogger(FormatterExample.class.getName());
public static void main(String[] args) throws IOException {
FileHandler fileHandler = new FileHandler("custom_logs.txt");
fileHandler.setFormatter(new CustomFormatter());
logger.addHandler(fileHandler);
logger.info("Mensaje formateado.");
}
}
LogManager: el cerebro detrás del sistema
El LogManager gestiona la configuración global de logging. Puedes cargar configuraciones personalizadas desde un archivo de propiedades:
import java.io.FileInputStream;
import java.io.IOException;
import java.util.logging.LogManager;
public class ConfigExample {
public static void main(String[] args) {
try {
LogManager.getLogManager().readConfiguration(new FileInputStream("logging.properties"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
Un archivo de configuración típico podría lucir así:
handlers= java.util.logging.ConsoleHandler
.level= INFO
java.util.logging.ConsoleHandler.level = WARNING
Consejos para gestionar logs en Java con java.util.logging.Logger
- Usa niveles de log apropiados: Por experiencia te digo que no uses SEVERE para mensajes triviales.
- Configura múltiples handlers: Hazme caso, divide los logs según su destino (consola, archivos, etc.).
- Implementa filtros: Excluye mensajes irrelevantes para mantener la claridad.
- Mantén el tamaño de los logs bajo control: Usa opciones como FileHandler.limit.
¿Te diste cuenta del gran uso de java.util.logging.Logger? Ahora sabes que gestionar logs es clave para depurar y optimizar aplicaciones en Java. Si quieres llevar tus habilidades al siguiente nivel, en el Bootcamp de Java Full Stack de KeepCoding aprenderás todo lo que necesitas para destacar en el mundo IT, desde logging hasta microservicios. ¡Apúntate hoy y transforma tu carrera!