En nuestro día a día, el desarrollo de aplicaciones no siempre es perfecto, por lo que en muchas ocasiones necesitaremos saber si un error en concreto se presenta en producción, o bien durante un proceso de pruebas.
Una de las mejores prácticas para tener un respaldo o monitorear el trace de nuestras aplicaciones y así poder atacar errores, es implementando un registro de logs controlado, de tal manera que no se guarden datos delicados y tampoco vaya a saturar el file system del servidor donde se despliegue la aplicación, sino que nos permita conocer cuando una transacción da error o no se ejecuta correctamente.
Para realizar la implementación de logs en nuestra aplicación, debemos importar las siguientes librerías a nuestra clase principal o la clase que efectúe la transacción:
import java.util.logging.ConsoleHandler; import java.util.logging.FileHandler; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.Logger; import java.util.logging.SimpleFormatter;
Posterior a eso debemos crear una variable global que indique el nombre del paquete que vamos a monitorear, ya sea una cierta cantidad de clases o bien solo el paquete donde tenemos la clase a registrar, en mí caso el paquete se llama com.pruebas.proyecto:
private final static Logger LOG_MONITOREO = Logger.getLogger("com.pruebas.proyecto");Ahora bien, con esto definido voy a explicar como escribir en el log con un ejemplo de una función, voy a irla explicando paso a paso en los comentarios:
public static String login(String usuario, String password){
String res = "";
try {
Handler consoleHandler = new ConsoleHandler(); //Estableceremos un manejador de errores
Handler fileHandler = new FileHandler("C:/Users/Emmanuel GR/Desktop/logs/Monitoreo.log", true);
/*Colocaremos la ruta donde se guardará el log, la propiedad true indica que siempre se escribirá sobre
el mismo archivo y no generará una copia hasta que este archivo sea igual a 5 mb de tamaño*/
SimpleFormatter simpleFormatter = new SimpleFormatter();// Se establece únicamente para generar un formato para la presentación de los errores o el trace
fileHandler.setFormatter(simpleFormatter);
LOG_MONITOREO.addHandler(consoleHandler);
LOG_MONITOREO.addHandler(fileHandler);
consoleHandler.setLevel(Level.ALL); //Este comando comenzará el manejador de errores
fileHandler.setLevel(Level.ALL); //Este comando se ejecuta para comenzar el proceso de registro del logger
// En ambos comando se debe colocar el nivel de registro de errores en el log por ende se colocar Level.ALL
/*El siguiente comando se utilizará para registrar lo que necesitemos ver dentro del log, aquí es donde definimos que datos se imprimiran en él*/
LOG_MONITOREO.log(Level.INFO, "Nueva Solicitud de Logueo");
LOG_MONITOREO.log(Level.INFO, "Usuario: " + usuario);
LOG_MONITOREO.log(Level.INFO, "Contraseña: " + password);
//Esta validación la realizaremos únicamente como ejemplo
if(usuario.equals("emmax77") && password.equals("1234567")){
LOG_MONITOREO.log(Level.INFO, "Logueo exitoso!");
res = "Logueo exitoso!";
}else{
LOG_MONITOREO.log(Level.WARNING, "Usuario o contraseña incorrecto");
res = "Usuario o contraseña incorrecto";
}
//Luego de realizar los registros debemos cerrar el hilo de conexión a nuestro archivo
fileHandler.close();
consoleHandler.close();
} catch (Exception e) {
//Registraremos la exception que ocurra en nuestro log
LOG_MONITOREO.log(Level.SEVERE, e.getMessage());
res = "Error, consulte con su proveedor del servicio";
}
return res;
}Nota: Debemos tener en cuenta que al crear la ruta donde se guardará el log, en caso de que alguna carpeta no exista o se haya escrito mal, el programa dará un error
Ahora bien, creamos nuestro método main y llamaremos nuestra función login:
public static void main(String[] args) {
String loginResponse = login("emmax77","1234567");
System.out.println("Respuesta de la función: " + loginResponse);
}Al ejecutarlo veremos que dentro de la carpeta logs en el escritorio, se creará un log llamado Monitoreo.log y dentro veremos la siguiente respuesta:

Vemos que el nivel de log es INFORMACIÓN, esto lo podemos cambiar dependiendo el nivel de gravedad que le queramos dar al error.
Existen diferente niveles de registro a la hora de imprimir un mensaje en un log, esto nos brindará un mejor filtro a la hora de revisar nuestro log, y así, determinar el nivel de gravedad del error.
Cada uno puede ser utilizado como nosotros queramos, en mi caso normalmente los uso así:
- INFO: Datos referentes a una transacción exitosa.
- WARNING: Errores de respuesta, ya sea de web service, una función, excepciones, entre otros.
- SEVERE: Errores que puedan bloquear el funcionamiento de un proceso, o botar mi aplicación

De esta forma, según nuestro código, si un usuario coloca una contraseña errónea, entonces nos aparecerá un mensaje de tipo ADVERTENCIA en nuestro log:

De esta manera podemos hacer la implementación de la clase LOGGER en nuestra aplicación, y así tener un registro controlado de nuestros errores.
