1.1 Introducción a los registros

El registro es una lista de eventos que han ocurrido. Casi como un diario o diario náutico. Bueno, en consecuencia, un registrador es un objeto con el que puede iniciar sesión. En programación, se acostumbra registrar casi todo. Y en Java, todo es así e incluso un poco más.

registrador java

El hecho es que los programas Java suelen ser grandes aplicaciones de servidor sin interfaz de usuario, consola, etc. Procesan solicitudes de miles de usuarios al mismo tiempo y, a menudo, se producen varios errores. Especialmente cuando diferentes hilos comienzan a interferir entre sí.

Y, de hecho, la única forma de encontrar errores y fallas que rara vez se reproducen en tal situación es escribir en el registro / archivo todo lo que sucede en cada hilo.

La mayoría de las veces, la información se escribe en el registro sobre los parámetros del método con el que se llamó, todos los errores interceptados y mucha información intermedia. Cuanto más completo sea el registro, más fácil será restaurar la secuencia de eventos y rastrear las causas de una falla o error.

Pero cuanto más grande es el registro, más difícil es trabajar con él. A veces, los registros alcanzan varios gigabytes por día. Esto esta bien.

1.2 Registros fallidos

Como los primeros registros, los desarrolladores utilizaron simplemente la salida a la consola . Es conveniente hacer esto durante la depuración de la aplicación, cuando toda la información importante y los valores de las variables se escriben en la consola. Pero dicho registro es completamente inaplicable durante el funcionamiento normal de la aplicación.

En primer lugar, es posible que la aplicación quiera enviar algo a la consola y el usuario no quiera ver la información de servicio destinada al programador en absoluto.

En segundo lugar, el tamaño del búfer de la consola es limitado, no puedes escribir mucho allí.

Y finalmente, en tercer lugar, la información sobre los errores del programa que se recopila durante un largo período de tiempo debe enviarse a los desarrolladores del programa. Y es más conveniente escribir toda esta información a la vez en un archivo.

Los desarrolladores resolvieron rápidamente el primer problema: se les ocurrió otro flujo de salida System.err. Puede escribirle mensajes y se enviarán a un hilo separado, y no a la consola estándar.

E incluso se resolvió el problema de escribir en un archivo:

// Define the file to which we will write the log
System.setErr(new PrintStream(new File("log.txt")));
// Display messages
System.err.println("Message 1");
System.err.println("Message 2");
// Display an error message
try {
    throw new Exception("Error message");
} catch (Exception e) {
    e.printStackTrace();
}

Pero incluso de esta forma, no resolvió todo el problema, por lo que se decidió crear una biblioteca especial que escribiera mensajes de registro en un archivo. Lo hizo de manera inteligente y permitió la flexibilidad de configurar filtros para eventos y datos registrados.

Todo el proceso de registro, de hecho, consta de tres partes:

  • La primera parte es la recopilación de información .
  • La segunda parte es el filtrado de la información recopilada.
  • La tercera parte es el registro de la información seleccionada.

1.3 Introducción al registrador log4j

El primer registrador popular en la comunidad de Java fue el log4j. Incluirlo en el proyecto es muy sencillo, para ello solo necesitas añadir un par de líneas a tu pom.xml


<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>2.2.17</version>
</dependency>

La interacción de su programa con dicho registrador se vería así:

class Manager {
   private static final Logger logger = LoggerFactory.getLogger(Manager.class);

   public boolean processTask(Task task) {
        logger.debug("processTask id = " + task.getId());
        try {
            task.start();
            task.progress();
            task.complete();
            return true;
        } catch (Exception e) {
            logger.error("Unknown error", e);
            return false;
        }
    }
}

Aquí pasan tres cosas:

La creación del objeto está resaltada en verde Logger . Su objeto se almacena en una variable estática para facilitar el trabajo posterior con él. Y también getLogger()se pasa al método información sobre la clase en la que se recopila la información.

La línea resaltada en azul es donde registramos información de valor solo durante la depuración . Para esto, se usa un método especial:debug()

Y por último, se destaca en rojo la línea donde guardamos la excepción que le ha surgido al log . Las excepciones son errores potenciales, por lo que el error().