JavaRush /Blog Java /Random-ES /¿Por qué es necesario el registro?

¿Por qué es necesario el registro?

Publicado en el grupo Random-ES
¡Hola! Al escribir conferencias, observo especialmente si un tema en particular definitivamente se utilizará en el trabajo real. ¿Por qué necesitas iniciar sesión? - 1 Así que ¡ATENCIÓN! El tema que tocaremos hoy definitivamente te será de utilidad en todos tus proyectos desde el primer día de trabajo. Hablaremos sobre el registro. Este tema no es nada difícil (incluso diría fácil). Pero en tu primer trabajo ya habrá suficiente estrés como para lidiar con las cosas obvias, así que es mejor resolverlo a fondo ahora :) Entonces, comencemos. ¿Qué es la tala? El registro consiste en registrar en algún lugar datos sobre el funcionamiento de un programa. El lugar donde se escriben estos datos se llama “ log ”. Surgen dos preguntas a la vez: ¿dónde y qué datos se registran? Empecemos con "dónde". Puede registrar datos de operación del programa en muchos lugares diferentes. Por ejemplo, durante tus estudios a menudo envías datos a la consola usando System.out.println(). Este es un registro real, aunque sea el más simple. Por supuesto, esto no es muy conveniente para el cliente o el equipo de soporte del producto: obviamente no querrán instalar el IDE y monitorear la consola :) También existe un formato más familiar para registrar información: en un archivo de texto. ¡Es mucho más fácil para la gente leerlos de esta manera y ciertamente mucho más fácil de almacenar! Ahora la segunda pregunta: ¿qué datos sobre el funcionamiento del programa deben registrarse en el registro? ¡Pero aquí todo depende de ti! El sistema de registro de Java es muy flexible. Puede configurarlo de tal manera que se registre todo el progreso de su programa. Por un lado, esto es bueno. Pero por otro lado, imagina qué tamaño pueden alcanzar los logs de Facebook o Twitter si todo está escrito allí. Es probable que empresas tan grandes tengan la capacidad de almacenar incluso esta cantidad de información. Pero imagine lo difícil que sería buscar información sobre un error crítico en registros que contienen 500 gigabytes de texto. Es incluso peor que una aguja en un pajar. Por lo tanto, el inicio de sesión en Java se puede configurar para que solo se escriban datos de error en el registro (registro). ¡O incluso sobre errores críticos! Aunque decir “iniciar sesión en Java” no es del todo correcto. El hecho es que la necesidad de iniciar sesión surgió entre los programadores antes de que se agregara esta funcionalidad al lenguaje. Y cuando Java tuvo su propia biblioteca de registro, todos ya usaban la biblioteca log4j. La historia de la aparición del registro en Java es realmente muy larga e informativa; en tu tiempo libre puedes leer esta publicación en Habré . En resumen, Java tiene su propia biblioteca de registro, pero casi nadie la usa :) Más tarde, cuando aparecieron varias bibliotecas de registro diferentes y todos los programadores comenzaron a usar otras diferentes, surgió un problema de compatibilidad. Para evitar que las personas hagan lo mismo usando una docena de bibliotecas diferentes con diferentes interfaces, se creó el marco de abstracción slf4j.(“Fachada de registro de servicios para Java”). Se llama abstracción porque aunque usas clases slf4j y llamas a sus métodos, bajo el capó tienen todos los marcos de registro anteriores en ejecución: log4j, java.util.logging estándar y otros. Si actualmente necesita alguna característica específica de log4j que otras bibliotecas no tienen, pero no le gustaría vincular estrictamente el proyecto a esta biblioteca en particular, simplemente use slf4j. Y ella ya "extraerá" los métodos log4j. Si cambia de opinión y decide que ya no necesita las funciones de log4j, sólo necesita reconfigurar el "contenedor" (es decir, slf4j) para usar otra biblioteca. Tu código no dejará de funcionar, porque en él llamas a métodos de slf4j, y no a una biblioteca específica. Una pequeña digresión. Para que los siguientes ejemplos funcionen, debe descargar la biblioteca slf4j desde aquí y la biblioteca log4j desde aquí . A continuación, debemos descomprimir el archivo y agregar los archivos jar que necesitamos al classpath a través de Intellij IDEA. Elementos del menú: Archivo -> Estructura del proyecto -> Bibliotecas Seleccione los archivos jar necesarios y agréguelos al proyecto (hay muchos archivos jar en los archivos que descargamos, mire los que necesita en las imágenes) ¿Por qué necesitas iniciar sesión? - 2¿Por qué necesitas iniciar sesión? - 3Nota: esta instrucción es para aquellos estudiantes que no saben cómo utilizar Maven. Si sabes cómo usarlo, es mejor intentar comenzar con él: suele ser mucho más fácil. Si usas Maven , agrega esta dependencia:
<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
</dependency>
Genial, hemos resuelto la configuración :) Veamos cómo funciona slf4j. ¿Cómo podemos asegurarnos de que el progreso del programa quede registrado en algún lugar? Para ello necesitamos dos cosas: un registrador y un agregador . Empecemos por el primero. Un registrador es un objeto que gestiona completamente el mantenimiento de registros . Crear un registrador es muy fácil: se hace mediante un método estático: LoggerFactory.getLogger(). Como parámetro del método, debe pasar una clase cuyo trabajo se registrará. Ejecutemos nuestro código:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Test log record!!!");
       LOGGER.error("В программе возникла ошибка!");
   }
}
Salida de la consola: ERROR StatusLogger No se encontró el archivo de configuración Log4j 2. Usando la configuración predeterminada (registrando solo errores en la consola) o configuraciones proporcionadas por el usuario mediante programación. Establezca la propiedad del sistema 'log4j2.debug' para mostrar el registro de inicialización interna de Log4j 2. Consulte https://logging.apache.org/log4j/2.x/manual/configuration.html para obtener instrucciones sobre cómo configurar Log4j 2 15:49:08.907 [principal] ERROR MyTestClass: ¡se ha producido un error en el programa! ¿Qué vemos aquí? Primero vemos un mensaje de error. Apareció porque actualmente carecemos de la configuración necesaria. Por lo tanto, nuestro registrador ahora solo puede generar mensajes de error (ERROR) y solo a la consola. El método logger.info()no fue ejecutado. ¡ Pero logger.error()funcionó! La consola muestra la fecha actual, el método donde ocurrió el error ( main), la palabra ERROR y nuestro mensaje. ERROR es el nivel de registro. En general, si una entrada del registro está marcada con la palabra ERROR, significa que ocurrió un error en ese punto del programa. Si una entrada está marcada con la palabra INFO, significa que es simplemente información actual sobre el funcionamiento normal del programa. La biblioteca SLF4J tiene bastantes niveles de registro diferentes que le permiten configurar el registro de manera flexible. Son muy fáciles de manejar: toda la lógica necesaria ya está incluida en la clase Logger. Sólo necesitas llamar a los métodos necesarios. Si desea publicar un mensaje normal, llame al logger.info(). Mensaje de error - logger.error(). Mostrar una advertencia: logger.warn() ahora hablemos del appender . El apéndice es el lugar de donde vienen sus datos. Se podría decir que lo opuesto a una fuente de datos es el "punto B". De forma predeterminada, los datos se envían a la consola. Tenga en cuenta que en el ejemplo anterior no tuvimos que configurar nada: el texto apareció en la propia consola, pero el registrador de la biblioteca log4j solo puede enviar mensajes de nivel de ERROR a la consola. Obviamente, es más conveniente para las personas leer registros de un archivo de texto y almacenar registros en los mismos archivos. Para cambiar el comportamiento predeterminado del registrador, necesitamos configurar nuestro agregador de archivos . Para empezar, necesita crear un archivo log4j.xml directamente en la carpeta src , o en la carpeta de recursos, si usa Maven, o en la carpeta de recursos, en caso de que use Maven. Ya estás familiarizado con el formato xml, recientemente tuvimos una conferencia al respecto :) Este será su contenido:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
   <Appenders>
       <File name="MyFileAppender" fileName="C:\Users\Username\Desktop\testlog.txt" immediateFlush="false" append="false">
           <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
       </File>
   </Appenders>
   <Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
   </Loggers>
</Configuration>
No parece particularmente complicado :) Pero sigamos repasando el contenido.
<Configuration status="INFO">
Este es el llamado registrador de estado. No está relacionado con nuestro registrador y log4j lo utiliza internamente. Puede establecer status=”TRACE” en lugar de status=”INFO”, y toda la información sobre el funcionamiento interno de log4j se enviará a la consola (status-logger envía datos a la consola, incluso si nuestro adjunto para el programa es un archivo -basado). No necesitamos esto ahora, así que dejaremos todo como está.
<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Евгений\Desktop\testlog.txt" append="true">
       <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
   </File>
</Appenders>
Aquí creamos nuestro appender. La etiqueta <File>indica que será un archivo. name="MyFileAppender"- el nombre de nuestro appender. fileName="C:\Users\Username\Desktop\testlog.txt"— ruta al archivo de registro donde se escribirán todos los datos. append="true"— si es necesario escribir datos adicionales al final del archivo. En nuestro caso así será. Si se establece en false , el contenido del registro anterior se eliminará cada vez que se inicie nuevamente el programa. <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>- Estas son configuraciones de formato. Aquí podemos usar expresiones regulares para personalizar el formato del texto en nuestro registro.
<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
Aquí especificamos el nivel de registro (nivel raíz). Tenemos el nivel INFO configurado: es decir, todos los mensajes en niveles superiores a INFO (según la tabla que vimos arriba) no se incluirán en el registro. Tendremos 3 mensajes en nuestro programa: un INFO, un WARN y un ERROR. Con la configuración actual, los 3 mensajes se escribirán en el registro. Si cambia el nivel raíz a ERROR, solo se registrará el último mensaje de LOGGER.error(). Además, aquí se coloca un enlace al anexo. Para crear dicho enlace, debe <Root>crear una etiqueta dentro de la etiqueta <ApprenderRef>y agregarle el parámetro ref=”Nombre твоего аппендера”. Creamos el nombre del appender aquí, en caso de que lo hayas olvidado: ¡ <File name="MyFileAppender" Y aquí está el código de nuestro programa!
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Начало работы программы!!!");

       try {
           LOGGER.warn("Внимание! Программа пытается разделить одно число на другое");
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Ошибка! Произошло деление на ноль!");
       }
   }
}
Por supuesto, es un poco torcido (captar RuntimeException es una idea mediocre), pero es perfecto para nuestros propósitos :) Ejecutemos nuestro método main()4 veces seguidas y miremos nuestro archivo testlog.txt. No es necesario crearlo con antelación: la biblioteca lo hará automáticamente. ¡Todo funcionó! :) Ahora tienes un registrador configurado. Puede jugar con algunos programas que escribió anteriormente, agregar llamadas al registrador a todos los métodos y mirar el registro resultante :) Para lecturas adicionales, recomiendo este artículo . Allí se analiza en profundidad el tema de la tala y no será fácil leerlo de una sola vez. Pero contiene mucha información adicional útil. Por ejemplo, aprenderá cómo configurar un registrador para que cree un nuevo archivo de texto si nuestro archivo testlog.txt alcanza un tamaño determinado :) ¡Y este es el final de nuestra lección! Hoy aprendiste sobre un tema muy importante y este conocimiento definitivamente te será útil en tu trabajo futuro. ¡Hasta luego! :)
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION