Dominando el Logging en Java: Fundamentos y mejores prácticas
Fundamentos de Logging en Java
En este tutorial, aprenderemos sobre Java Logging y sus diversos componentes con la ayuda de ejemplos.
Java nos permite crear y capturar mensajes de log y archivos a través del proceso de logging.
En Java, el logging requiere frameworks y APIs. Java tiene un framework de logging integrado en el paquete java.util.logging.
También podemos usar frameworks de terceros como Log4j, Logback y muchos más para propósitos de logging.
Componentes de Java Logging
La figura a continuación representa los componentes principales y el flujo de control de la API de Java Logging (java.util.logging).

1. Logger
La clase Logger proporciona métodos para logging. Podemos instanciar objetos de la clase Logger y llamar a sus métodos para propósitos de logging.
Tomemos un ejemplo.
Logger logger = Logger.getLogger("nuevoNombreLogger");
El método getLogger() de la clase Logger se usa para encontrar o crear un nuevo Logger. El argumento string define el nombre del logger.
Aquí, esto crea un nuevo objeto Logger o retorna un Logger existente con el mismo nombre.
Es convención definir un Logger después de la clase actual usando class.getName().
Logger logger = Logger.getLogger(MiClase.class.getName());
NullPointerException si el nombre pasado es null.Cada Logger tiene un nivel que determina la importancia del mensaje de log. Hay 7 niveles de log básicos:
| Nivel de Log (en orden descendente) | Uso |
|---|---|
| SEVERE | falla grave |
| WARNING | mensaje de advertencia, un problema potencial |
| INFO | información general de runtime |
| CONFIG | información de configuración |
| FINE | información general de desarrollador (mensajes de traza) |
| FINER | información detallada de desarrollador (mensajes de traza) |
| FINEST | información altamente detallada de desarrollador (mensajes de traza) |
| OFF | apagar logging para todos los niveles (no capturar nada) |
| ALL | encender logging para todos los niveles (capturar todo) |
Cada nivel de log tiene un valor entero que determina su severidad excepto dos niveles especiales OFF y ALL.
Registrando el mensaje
Por defecto, los tres niveles de log superiores siempre se registran. Para establecer un nivel diferente, podemos usar el siguiente código:
logger.setLevel(Level.NivelLog); // ejemplo logger.setLevel(Level.FINE);
En este ejemplo, solo el nivel FINE y niveles superiores se establecen para ser registrados. Todos los demás mensajes de log son descartados.
Ahora para registrar un mensaje, usamos el método log().
logger.log(Level.NivelLog, "mensaje de log"); // ejemplo logger.log(Level.INFO, "Este es mensaje de nivel INFO");
Hay métodos abreviados para registrar en niveles deseados.
logger.info("Este es mensaje de nivel INFO"); logger.warning("Este es mensaje de nivel WARNING");
Todas las peticiones de log que han pasado el nivel de log establecido son luego reenviadas al LogRecord.
null, su nivel se hereda de su padre y así sucesivamente arriba en el árbol.2. Filtros (Filters)
Un filtro (si está presente) determina si el LogRecord debe ser reenviado o no. Como su nombre sugiere, filtra los mensajes de log según criterios específicos.
Un LogRecord solo se pasa del logger al log handler y del log handler a sistemas externos si pasa los criterios especificados.
// establecer un filtro logger.setFilter(filtro); // obtener un filtro Filter filtro = logger.getFilter();
3. Handlers (Appenders)
El log handler o appenders reciben el LogRecord y lo exportan a varios destinos.
Java SE proporciona 5 handlers integrados:
| Handlers | Uso |
|---|---|
StreamHandler | escribe a un OutputStream |
ConsoleHandler | escribe a consola |
FileHandler | escribe a archivo |
SocketHandler | escribe a puertos TCP remotos |
MemoryHandler | escribe a memoria |
Un handler puede pasar el LogRecord a un filtro para determinar de nuevo si puede ser reenviado a sistemas externos o no.
Para agregar un nuevo handler, usamos el siguiente código:
logger.addHandler(handler); // ejemplo Handler handler = new ConsoleHandler(); logger.addHandler(handler);
Para remover un handler, usamos el siguiente código:
logger.removeHandler(handler); // ejemplo Handler handler = new ConsoleHandler(); logger.addHandler(handler); logger.removeHandler(handler);
Un logger puede tener múltiples handlers. Para obtener todos los handlers, usamos el siguiente código:
Handler[] handlers = logger.getHandlers();
4. Formatters
Un handler también puede usar un Formatter para formatear el objeto LogRecord en un string antes de exportarlo a sistemas externos.
Java SE tiene dos Formatters integrados:
| Formatters | Uso |
|---|---|
SimpleFormatter | formatea LogRecord a string |
XMLFormatter | formatea LogRecord a forma XML |
Podemos usar el siguiente código para formatear un handler:
// formatea a forma string handler.setFormatter(new SimpleFormatter()); // formatea a forma XML handler.setFormatter(new XMLFormatter());
LogManager
El objeto LogManager mantiene un registro de la información global de logging. Lee y mantiene la configuración de logging y las instancias de logger.
El log manager es un singleton, lo que significa que solo una instancia de él es instanciada.
Para obtener la instancia del log manager, usamos el siguiente código:
LogManager manager = LogManager.getLogManager();
Ventajas del Logging
Aquí algunas ventajas del logging en Java.
- ayuda a monitorear el flujo del programa
- ayuda a capturar cualquier error que pueda ocurrir
- proporciona soporte para diagnóstico de problemas y debugging
Java
- Dominando el Logging en Java: Mejores Prácticas Esenciales para Código Fiable
- Dominar Operadores en Java: Tipos, Sintaxis y Ejemplos Prácticos
- Comentarios en Java: Tipos, Uso y Mejores Prácticas
- Dominar el Bucle for Mejorado en Java: Sintaxis, Ejemplos y Mejores Prácticas
- Dominar Strings en Java: Creación, Métodos y Mejores Prácticas
- Dominando interfaces en Java: Conceptos, implementación y mejores prácticas
- Dominando las clases internas anónimas en Java: Definición, sintaxis y ejemplos prácticos
- Dominando Try‑with‑Resources en Java: Gestión automática de recursos explicada
- Anotaciones en Java explicadas: Tipos, ubicación y ejemplos prácticos
- Aserciones en Java: Guía práctica para detectar bugs y asegurar fiabilidad del código
- Entendiendo Java Vector: Uso, Características y Comparación con ArrayList