Java: réduire les journaux multilignes en un journal unifilaire à l'aide de Spring and Logback ou Log4j2

Logback et Log4j2 sont parmi les frameworks de journalisation JAVA les plus connus. Le cadre Logback est utilisé uniquement en conjonction avec la bibliothèque SLF4J, qui est une interface pour les systèmes de journalisation des événements. Log4j2 est la deuxième version améliorée de l'enregistreur Log4, une bibliothèque de journalisation dans laquelle l'API et l'implémentation sont séparées, ce qui vous permet d'utiliser l'API Log4j 2 en conjonction avec l'implémentation d'un autre enregistreur.

Spring Music est une application permettant d'utiliser le service de base de données d'environnement Cloud Foundry conjointement avec Spring Framework et Spring Boot. Il a été créé pour stocker les mêmes objets de domaine dans l'un des nombreux référentiels différents - relationnel objet, orienté document ou distribué (magasin de valeurs-clés).



Les deux enregistreurs les plus courants utilisés avec Spring / Spring Boot sont Logback et Log4j2. Jusqu'à récemment, le développeur disposait d'une plus grande liberté d'action concernant le format des journaux et les fichiers eux-mêmes utilisés pour la journalisation. Cependant, dans le monde moderne de l'implémentation et de la mise à l'échelle des conteneurs, la journalisation offre généralement des solutions d'entreprise qui nécessitent un certain niveau de standardisation.

L'un des plus gros problèmes est que les exceptions Java entraînent généralement un traçage de pile multi-lignes important dans les journaux. Pour cette raison, au lieu d'un seul événement de journal indiquant une exception ou un message d'erreur, vous avez plus de 100 journaux différents, un pour chaque ligne de la trace de pile, entrecoupés d'autres événements de journal provenant d'autres services ou instances de service.

Cet article décrit comment configurer l'application Spring Boot pour réduire les exceptions sur une seule ligne pour l'enregistreur Logback et Log4j2. Cela nous permet de considérer la journalisation des exceptions et le traçage de pile comme un seul journal des événements.


Classes d'erreur et d'exception dans JAVA


Exceptions d'exception JAVA cochées et non cochées

Spring Music App


Dans cet article, pour la journalisation personnalisée, une version personnalisée de l'application Spring-Music est utilisée, ce qui est nécessaire pour le fonctionnement des enregistreurs Logback et Log4j2. Vous devez d'abord vous assurer que nous pouvons le recréer à partir de la source. Le projet nécessite Java8, donc la première étape consiste à installer Java8 sur votre hôte Ubuntu.



Ensuite, nous prenons le code source du projet avec github et créons l'assembly en utilisant les scripts intégrés du système de construction Gradle:



Réduire les exceptions multilignes à l'aide de Logback


Passons à autre chose et créons une archive jar du projet jar avec l'implémentation de l'enregistreur Logback à l'aide de la commande Gradle standard:



Le fichier «build / libs / spring-music.jar» est auto-exécutable et contient un Tomcat intégré lié à localhost: 8080. Le fichier jar est appelé à l'aide de la commande:



L'appel de http: // localhost: 8080 dans le navigateur vous montrera une page avec une liste d'albums, et la ligne de journal qui ressemble à ceci sera affichée dans la console:



Cette syntaxe de ligne de journal est définie dans « src / main / resources / logback-spring.xml » à l'aide d'un modèle personnalisé:



Les variables $ {...} sont extraites de application.properties et des propriétés système, qui peuvent être consultées sur la page http: // localhost: 8080 / env . Cependant, la partie du code dont nous avons besoin se trouve immédiatement après le message (% m).



Le mot 'MULTIEXCEPTION' n'a pas de signification particulière, c'est juste un marqueur de chaîne unique qui nous permet de savoir où se termine le message (% m) et où commence l'exception. Si vous le souhaitez, vous pouvez laisser ce marqueur.

En outre, au lieu d'insérer simplement un espace réservé% xException qui lancerait une grande trace de pile avec des caractères de nouvelle ligne, nous convertissons la valeur avec la fonction% replace et remplaçons tous les caractères de nouvelle ligne par l'expression «\ u2028», qui est une vue de délimiteur de chaîne Unicode. .

La suppression des caractères "\ n" de la trace de pile signifie que la trace de pile sera désormais envoyée sous forme de ligne unique. Pour le prouver, accédez à http: // localhost: 8080 / errors / throw , où se trouve un contrôleur d'erreur qui déclenche intentionnellement une NullPointerException avec le code suivant:



Cela crée une ligne de journal dans la console, illustrée ci-dessous:



On peut voir ici que l'expression «u2028» sépare ce qui était autrefois un saut de ligne dans la trace de pile. Maintenant, le message d'exception et la trace de pile seront envoyés comme une unité.



Réduire les exceptions multilignes à l'aide de Log4j2


Pour remplacer le script de construction par défaut et utiliser Log4j2 comme implémentation de sauvegarde de ce projet, vous devez utiliser le fichier «build-log4j2.gradle».



Le fichier «build / libs / spring-music.jar» est auto-exécutable et utilise le Tomcat intégré, qui est lié à localhost: 8080. Comme dans l'exemple précédent, le fichier jar est appelé à l'aide de la commande:



L'appel de http: // localhost: 8080 à l' aide d'un navigateur affichera une page avec une liste d'albums avec une sortie de ligne de journal vers la console qui ressemble à ceci:



Cette syntaxe de ligne de journal est définie dans « src / main / resources / log4j2.xml » à l'aide d'un modèle personnalisé:



Les variables $ {...} sont extraites de application.properties et des propriétés système, qui peuvent être consultées sur la page http: // localhost: 8080 / env . Cependant, la partie du code dont nous avons besoin se trouve immédiatement après le message (% m).



Le mot 'MULTIEXCEPTION' n'a pas de signification particulière, c'est juste un marqueur de ligne unique de notre choix, qui vous permet de savoir où se termine le message (% m) et où commence l'exception. Si vous voulez, vous pouvez le laisser.

Mais après cela, au lieu d'insérer simplement un espace réservé% xException qui lancerait une grande trace de pile avec des caractères de nouvelle ligne, nous convertissons la valeur avec la fonction% replace, qui remplace tous les caractères de nouvelle ligne avec l'expression «\ u2028», qui est un délimiteur Chaînes Unicode .

La suppression des caractères "\ n" de la trace de pile signifie que la trace de pile sera désormais envoyée sur une seule ligne. Pour le prouver, accédez à http: // localhost: 8080 / errors / throw , où se trouve un contrôleur d'erreur qui déclenche intentionnellement une NullPointerException à l'aide du code suivant:



Cela crée une ligne de journal dans la console, illustrée ci-dessous:



Comme vous pouvez le voir, ici l'expression «u2028» sépare ce qui était un saut de ligne dans la trace de la pile. Maintenant, le message d'exception et la trace de pile seront envoyés comme une unité.

Conclusions


La possibilité de réduire la trace multi-lignes de la pile Java en une seule ligne signifie que cette technique peut être considérée comme une solution de journalisation centralisée unique.
Il n'y a aucune raison de gaspiller des ressources informatiques et humaines pour restaurer la trace de pile du côté destination en utilisant des identificateurs de corrélation, de grandes tailles de pile, une utilisation élevée du processeur et une analyse intelligente s'il est beaucoup plus efficace d'effectuer ce pliage du côté source.

Dans ce cas, le caractère Unicode peut toujours être remplacé du côté de la collecte des journaux (par exemple, du côté du pipeline pour la collecte, le filtrage et la normalisation des journaux Logstash) pour restaurer le message dans son format d'origine.

Matériel de référence



Un peu de publicité :)


Merci de rester avec nous. Aimez-vous nos articles? Vous voulez voir des matériaux plus intéressants? Soutenez-nous en passant une commande ou en recommandant à vos amis des VPS basés sur le cloud pour les développeurs à partir de 4,99 $ , un analogue unique de serveurs d'entrée de gamme que nous avons inventés pour vous: Toute la vérité sur les VPS (KVM) E5-2697 v3 (6 cœurs) 10 Go DDR4 480 Go SSD 1 Gbit / s à partir de 19 $ ou comment diviser le serveur? (les options sont disponibles avec RAID1 et RAID10, jusqu'à 24 cœurs et jusqu'à 40 Go de DDR4).

Dell R730xd 2 fois moins cher au centre de données Equinix Tier IV à Amsterdam? Nous avons seulement 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV à partir de 199 $ aux Pays-Bas! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - à partir de 99 $! Pour en savoir plus sur la création d'un bâtiment d'infrastructure. classe utilisant des serveurs Dell R730xd E5-2650 v4 coûtant 9 000 euros pour un sou?

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


All Articles