Java: contraiga los registros de varias líneas en un registro de una sola línea utilizando Spring y Logback o Log4j2

Logback y Log4j2 son algunos de los marcos de registro de JAVA más famosos. El marco Logback se usa solo junto con la biblioteca SLF4J, que es una interfaz para sistemas de registro de eventos. Log4j2 es la segunda versión mejorada del registrador Log4, una biblioteca de registro en la que la API y la implementación están separadas, lo que le permite utilizar la API Log4j 2 junto con la implementación de otro registrador.

Spring Music es una aplicación para usar el servicio de base de datos del entorno Cloud Foundry junto con Spring Framework y Spring Boot. Fue creado para almacenar los mismos objetos de dominio en uno de los muchos repositorios diferentes: relacional a objetos, orientado a documentos o distribuido (almacén de valores clave).



Los dos registradores más comunes que se usan con Spring / Spring Boot son Logback y Log4j2. Hasta hace poco, el desarrollador tenía más libertad de acción con respecto al formato de los registros y los propios archivos utilizados para el registro. Sin embargo, en el mundo moderno de implementación y escala de contenedores, el registro generalmente ofrece soluciones empresariales que requieren un cierto nivel de estandarización.

Uno de los mayores problemas es que las excepciones de Java generalmente dan como resultado un gran seguimiento de la pila de varias líneas en los registros. Debido a esto, en lugar de un solo evento de registro que indica una excepción o un mensaje de error, obtiene más de 100 registros diferentes, uno para cada línea del seguimiento de la pila, intercalados con otros eventos de registro de otros servicios o instancias de servicio.

Este artículo describe cómo configurar la aplicación Spring Boot para colapsar las excepciones en una sola línea tanto para Logger logger como para Log4j2. Esto nos permite considerar el registro de excepciones y el seguimiento de la pila como un registro de eventos.


Clases de error y excepción en JAVA


JAVA Marcado y sin marcar Excepciones de excepción sin marcar

Spring Music App


En este artículo, para el registro personalizado, se utiliza una versión personalizada de la aplicación Spring-Music , que es necesaria para el funcionamiento de los registradores Logback y Log4j2. Primero debe asegurarse de que podamos recrearlo desde la fuente. El proyecto requiere Java8, por lo que el primer paso es instalar Java8 en su host Ubuntu.



Luego tomamos el código fuente del proyecto con github y creamos el ensamblaje utilizando los scripts integrados del sistema de compilación Gradle:



Contraer excepciones de varias líneas con Logback


Continuemos y creemos un archivo jar del proyecto jar con la implementación del registrador Logback usando el comando Gradle estándar:



El archivo "build / libs / spring-music.jar" se ejecuta automáticamente y contiene un Tomcat incorporado que está vinculado a localhost: 8080. El archivo jar se llama usando el comando:



Llamar a http: // localhost: 8080 en el navegador le mostrará una página con una lista de álbumes, y la línea de registro que se ve así se mostrará en la consola:



Esta sintaxis de línea de registro se define en " src / main / resources / logback-spring.xml " utilizando una plantilla personalizada:



Las variables $ {...} se extraen de application.properties y las propiedades del sistema, que se pueden ver en la página en http: // localhost: 8080 / env . Sin embargo, la parte del código que necesitamos se encuentra inmediatamente después del mensaje (% m).



La palabra 'MULTIEXCEPTION' no tiene un significado especial, es solo un marcador de cadena único que nos permite averiguar dónde termina el mensaje (% m) y comienza la excepción. Si lo desea, puede dejar este marcador.

Además, en lugar de simplemente insertar un marcador de posición% xException que arrojaría una traza de pila grande con caracteres de nueva línea, convertimos el valor utilizando la función% replace y reemplazamos todos los caracteres de nueva línea con la expresión "\ u2028", que es una vista de delimitador de cadena Unicode .

Eliminar los caracteres "\ n" de la traza de la pila significa que ahora la traza de la pila se enviará ahora en una sola línea. Para probar esto, vaya a http: // localhost: 8080 / errors / throw , donde hay un controlador de errores que arroja intencionalmente una NullPointerException con el siguiente código:



Esto crea una línea de registro en la consola, que se muestra a continuación:



Se puede ver aquí que la expresión "u2028" separa lo que solía ser un avance de línea en el seguimiento de la pila. Ahora el mensaje de excepción y el seguimiento de la pila se enviarán como una unidad.



Contraer excepciones de varias líneas con Log4j2


Para anular el script de compilación predeterminado y usar Log4j2 como la implementación de copia de seguridad de este proyecto, debe usar el archivo "build-log4j2.gradle".



El archivo "build / libs / spring-music.jar" se ejecuta automáticamente y utiliza el Tomcat incorporado, que está vinculado a localhost: 8080. Como en el ejemplo anterior, el archivo jar se llama usando el comando:



Llamar a http: // localhost: 8080 usando un navegador mostrará una página con una lista de Álbumes con una salida de línea de registro a la consola que se ve así:



Esta sintaxis de línea de registro se define en " src / main / resources / log4j2.xml " utilizando una plantilla personalizada:



Las variables $ {...} se extraen de application.properties y las propiedades del sistema, que se pueden ver en la página en http: // localhost: 8080 / env . Sin embargo, la parte del código que necesitamos se encuentra inmediatamente después del mensaje (% m).



La palabra 'MULTIEXCEPTION' no tiene un significado especial, es solo un marcador de línea único de nuestra elección, que le permite averiguar dónde termina el mensaje (% m) y comienza la excepción. Si quieres, puedes dejarlo.

Pero después de eso, en lugar de simplemente insertar un marcador de posición% xException que arrojaría una traza de pila grande con caracteres de nueva línea, convertimos el valor con la función% replace, que reemplaza todos los caracteres de nueva línea con la expresión "\ u2028", que es un delimitador Cuerdas Unicode .

Eliminar los caracteres "\ n" de la traza de la pila significa que ahora la traza de la pila se enviará ahora como una sola línea. Para probar esto, vaya a http: // localhost: 8080 / errors / throw , donde hay un controlador de errores que arroja intencionalmente una NullPointerException con el siguiente código:



Esto crea una línea de registro en la consola, que se muestra a continuación:



Como puede ver, aquí la expresión "u2028" separa lo que solía ser un avance de línea en el seguimiento de la pila. Ahora el mensaje de excepción y el seguimiento de la pila se enviarán como una unidad.

Conclusiones


La capacidad de colapsar la traza de varias líneas de la pila de Java en una línea significa que esta técnica puede considerarse como una única solución de registro centralizada.
No hay razón para desperdiciar recursos computacionales y humanos en la restauración del seguimiento de la pila en el lado de destino utilizando identificadores de correlación, tamaños de pila grandes, alta utilización del procesador y análisis inteligente si es mucho más eficiente realizar este plegado en el lado de origen.

En este caso, el carácter Unicode siempre se puede reemplazar en el lado de recopilación de registros (por ejemplo, en el lado de la canalización para recopilar, filtrar y normalizar los registros de Logstash) para restaurar el mensaje en su formato original.

Material de referencia



Un poco de publicidad :)


Gracias por quedarte con nosotros. ¿Te gustan nuestros artículos? ¿Quieres ver más materiales interesantes? Apóyenos haciendo un pedido o recomendando a sus amigos VPS basado en la nube para desarrolladores desde $ 4.99 , un análogo único de servidores de nivel básico que inventamos para usted: toda la verdad sobre VPS (KVM) E5-2697 v3 (6 núcleos) 10GB DDR4 480GB SSD 1Gbps desde $ 19 o cómo dividir el servidor? (las opciones están disponibles con RAID1 y RAID10, hasta 24 núcleos y hasta 40GB DDR4).

Dell R730xd 2 veces más barato en el centro de datos Equinix Tier IV en Amsterdam? ¡Solo tenemos 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV desde $ 199 en los Países Bajos! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - ¡desde $ 99! Lea sobre Cómo construir un edificio de infraestructura. clase utilizando servidores Dell R730xd E5-2650 v4 que cuestan 9,000 euros por un centavo?

Source: https://habr.com/ru/post/482804/


All Articles