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.