JavaRush /Blog Java /Random-FR /Pourquoi la journalisation est-elle nécessaire ?

Pourquoi la journalisation est-elle nécessaire ?

Publié dans le groupe Random-FR
Bonjour! Lors de la rédaction de conférences, je note particulièrement si un sujet particulier sera définitivement utilisé dans un travail réel. Pourquoi avez-vous besoin d'une journalisation - 1 Alors ATTENTION ! Le sujet que nous aborderons aujourd'hui vous sera certainement utile sur tous vos projets dès le premier jour de travail. Nous parlerons de journalisation. Ce sujet n’est pas du tout difficile (je dirais même facile). Mais lors de votre premier emploi, il y aura déjà suffisamment de stress pour encore gérer les choses évidentes, il vaut donc mieux faire le tri en profondeur maintenant :) Alors commençons. Qu’est-ce que la journalisation ? La journalisation consiste à enregistrer quelque part des données sur le fonctionnement d'un programme. L'endroit où ces données sont écrites est appelé le « log ». Deux questions se posent à la fois : où et quelles données sont enregistrées ? Commençons par « où ». Vous pouvez enregistrer les données de fonctionnement du programme à de nombreux endroits différents. Par exemple, pendant vos études, vous transmettez souvent des données sur la console à l'aide de System.out.println(). Il s'agit d'une véritable journalisation, même si elle est la plus simple. Bien sûr, ce n'est pas très pratique pour le client ou l'équipe de support produit : ils ne voudront évidemment pas installer l'IDE et surveiller la console :) Il existe également un format plus familier pour enregistrer des informations - dans un fichier texte. Il est beaucoup plus facile pour les gens de les lire de cette façon, et certainement beaucoup plus facile de les stocker ! Maintenant, la deuxième question : quelles données sur le fonctionnement du programme doivent être enregistrées dans le journal ? Mais ici tout dépend de vous ! Le système de journalisation Java est très flexible. Vous pouvez le configurer de manière à ce que toute la progression de votre programme soit enregistrée. D'un côté, c'est bien. Mais d’un autre côté, imaginez quelle taille les logs de Facebook ou Twitter peuvent atteindre si tout y est écrit. Ces grandes entreprises ont probablement la capacité de stocker même cette quantité d’informations. Mais imaginez à quel point il serait difficile de rechercher des informations sur une erreur critique dans des journaux contenant 500 Go de texte ? C'est encore pire qu'une aiguille dans une botte de foin. Par conséquent, la connexion en Java peut être configurée de manière à ce que seules les données d'erreur soient écrites dans le journal (log). Ou même juste des erreurs critiques ! Cependant, dire « se connecter à Java » n’est pas tout à fait correct. Le fait est que le besoin de journalisation est apparu chez les programmeurs avant que cette fonctionnalité ne soit ajoutée au langage. Et au moment où Java avait sa propre bibliothèque de journalisation, tout le monde utilisait déjà la bibliothèque log4j. L'histoire de l'apparition de la journalisation en Java est en réalité très longue et instructive ; à votre guise, vous pouvez lire cet article sur Habré . En bref, Java possède sa propre bibliothèque de journalisation, mais presque personne ne l'utilise :) Plus tard, lorsque plusieurs bibliothèques de journalisation différentes sont apparues et que tous les programmeurs ont commencé à en utiliser des différentes, un problème de compatibilité est survenu. Pour empêcher les gens de faire la même chose en utilisant une douzaine de bibliothèques différentes avec des interfaces différentes, le framework d'abstraction slf4j a été créé(« Façade de journalisation des services pour Java »). Cela s'appelle l'abstraction car même si vous utilisez des classes slf4j et appelez leurs méthodes, sous le capot, tous les frameworks de journalisation précédents sont en cours d'exécution : log4j, java.util.logging standard et autres. Si vous avez actuellement besoin d'une fonctionnalité spécifique de log4j que d'autres bibliothèques n'ont pas, mais que vous ne souhaitez pas lier strictement le projet à cette bibliothèque particulière, utilisez simplement slf4j. Et elle va déjà « extraire » les méthodes log4j. Si vous changez d'avis et décidez que vous n'avez plus besoin des fonctionnalités de log4j, il vous suffit de reconfigurer le « wrapper » (c'est-à-dire slf4j) pour utiliser une autre bibliothèque. Votre code ne cessera pas de fonctionner, car vous y appelez des méthodes de slf4j, et non d'une bibliothèque spécifique. Une petite parenthèse. Pour que les exemples suivants fonctionnent, vous devez télécharger la bibliothèque slf4j à partir d'ici et la bibliothèque log4j à partir d'ici . Ensuite, nous devons décompresser l'archive et ajouter les fichiers jar dont nous avons besoin au chemin de classe via Intellij IDEA. Éléments de menu : Fichier -> Structure du projet -> Bibliothèques Sélectionnez les fichiers jar nécessaires et ajoutez-les au projet (il y a de nombreux fichiers jar dans les archives que nous avons téléchargées, regardez ceux dont vous avez besoin dans les images) Pourquoi avez-vous besoin d'une journalisation - 2Pourquoi avez-vous besoin d'une journalisation - 3Remarque - cette instruction est pour ceux les étudiants qui ne savent pas utiliser Maven. Si vous savez comment l'utiliser, il vaut mieux essayer de commencer par lui : c'est généralement beaucoup plus simple. Si vous utilisez Maven , ajoutez cette dépendance :
<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
</dependency>
Super, nous avons réglé les paramètres :) Voyons comment fonctionne slf4j. Comment pouvons-nous nous assurer que la progression du programme est enregistrée quelque part ? Pour cela, nous avons besoin de deux choses : un enregistreur et un appender . Commençons par le premier. Un enregistreur est un objet qui gère complètement la tenue des registres . Créer un logger est très simple : cela se fait à l'aide d'une méthode statique - LoggerFactory.getLogger(). En tant que paramètre de la méthode, vous devez transmettre une classe dont le travail sera enregistré. Exécutons notre code :
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("В программе возникла ошибка!");
   }
}
Sortie de la console : ERREUR StatusLogger Aucun fichier de configuration Log4j 2 trouvé. Utilisation de la configuration par défaut (enregistrant uniquement les erreurs sur la console) ou des configurations fournies par l'utilisateur par programme. Définissez la propriété système « log4j2.debug » pour afficher la journalisation d'initialisation interne de Log4j 2. Voir https://logging.apache.org/log4j/2.x/manual/configuration.html pour obtenir des instructions sur la configuration de Log4j 2 15:49:08.907 [main] ERREUR MyTestClass - Une erreur s'est produite dans le programme ! Que voit-on ici ? Nous voyons d’abord un message d’erreur. Cela est apparu parce que nous ne disposons actuellement pas des paramètres nécessaires. Par conséquent, notre enregistreur ne peut désormais afficher que des messages d'erreur (ERROR) et uniquement vers la console. La méthode logger.info()n'a pas été exécutée. Mais logger.error()ça a marché ! La console affiche la date actuelle, la méthode où l'erreur s'est produite ( main), le mot ERREUR et notre message ! ERROR est le niveau de journalisation. En général, si une entrée du journal est marquée du mot ERREUR, cela signifie qu'une erreur s'est produite à ce stade du programme. Si une entrée est marquée du mot INFO, cela signifie qu'il s'agit simplement d'informations actuelles sur le fonctionnement normal du programme. La bibliothèque SLF4J propose plusieurs niveaux de journalisation différents qui vous permettent de configurer la journalisation de manière flexible. Ils sont très simples à gérer : toute la logique nécessaire est déjà incluse dans la classe Logger. Il vous suffit d'appeler les méthodes nécessaires. Si vous souhaitez poster un message régulier, appelez le logger.info(). Message d'erreur - logger.error(). Afficher un avertissement - logger.warn() Parlons maintenant de l'appender . L'appender est l'endroit où arrivent vos données. On pourrait dire que le contraire d’une source de données est le « point B ». Par défaut, les données sont sorties vers la console. Veuillez noter que dans l'exemple précédent, nous n'avons rien eu à configurer : le texte est apparu dans la console elle-même, mais le logger de la bibliothèque log4j ne peut afficher que des messages de niveau ERREUR sur la console. Il est évidemment plus pratique pour les utilisateurs de lire les journaux à partir d'un fichier texte et de les stocker dans les mêmes fichiers. Pour modifier le comportement par défaut de l'enregistreur, nous devons configurer notre appender de fichiers . Pour commencer, vous devez créer un fichier log4j.xml directement dans le dossier src , ou dans le dossier ressources, si vous utilisez Maven, ou dans le dossier ressources, si vous utilisez Maven. Vous connaissez déjà le format xml, nous avons récemment eu une conférence à ce sujet :) Voici quel sera son contenu :
<?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>
Cela n'a pas l'air particulièrement compliqué :) Mais parcourons quand même le contenu.
<Configuration status="INFO">
C'est ce qu'on appelle l'enregistreur de statut. Il n'est pas lié à notre enregistreur et est utilisé en interne par log4j. Vous pouvez définir status=”TRACE” au lieu de status=”INFO”, et toutes les informations sur le fonctionnement interne de log4j seront affichées sur la console (status-logger envoie des données à la console, même si notre appender pour le programme est un fichier -basé). Nous n’en avons pas besoin maintenant, nous allons donc tout laisser tel quel.
<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>
Ici, nous créons notre appender. La balise <File>indique qu'il s'agira d'un fichier. name="MyFileAppender"- le nom de notre appender. fileName="C:\Users\Username\Desktop\testlog.txt"— chemin d'accès au fichier journal dans lequel toutes les données seront écrites. append="true"— s'il est nécessaire d'écrire des données supplémentaires à la fin du fichier. Dans notre cas, ce sera le cas. S'il est défini sur false , l'ancien contenu du journal sera supprimé à chaque redémarrage du programme. <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>- Ce sont des paramètres de formatage. Ici, nous pouvons utiliser des expressions régulières pour personnaliser le format du texte dans notre journal.
<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
Ici, nous spécifions le niveau de journalisation (niveau racine). Nous avons le niveau INFO défini : c'est-à-dire que tous les messages à des niveaux supérieurs à INFO (selon le tableau que nous avons examiné ci-dessus) ne seront pas inclus dans le journal. Nous aurons 3 messages dans notre programme : un INFO, un WARN et un ERROR. Avec la configuration actuelle, les 3 messages seront écrits dans le journal. Si vous modifiez le niveau racine en ERROR, seul le dernier message de LOGGER.error() sera enregistré. De plus, un lien vers l'appender est placé ici. Pour créer un tel lien, vous devez <Root>créer une balise à l'intérieur de la balise <ApprenderRef>et y ajouter le paramètre ref=”Name твоего аппендера”. Nous avons créé le nom de l'appender ici, au cas où vous l'auriez oublié : <File name="MyFileAppender" Et voici le code de notre programme !
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("Ошибка! Произошло деление на ноль!");
       }
   }
}
Bien sûr, c'est un peu tordu (attraper RuntimeException est une idée médiocre), mais c'est parfait pour nos besoins :) Exécutons notre méthode main()4 fois de suite et regardons notre fichier testlog.txt. Il n'est pas nécessaire de le créer à l'avance : la bibliothèque le fera automatiquement. Tout a fonctionné ! :) Vous avez maintenant un enregistreur configuré. Vous pouvez jouer avec certains programmes que vous avez écrits plus tôt, en ajoutant des appels de journalisation à toutes les méthodes et en consultant le journal résultant :) Pour une lecture supplémentaire, je recommande fortement cet article . Le sujet de l'exploitation forestière y est abordé en profondeur et il ne sera pas facile de le lire d'un seul coup. Mais il contient de nombreuses informations supplémentaires utiles. Par exemple, vous apprendrez à configurer un logger pour qu'il crée un nouveau fichier texte si notre fichier testlog.txt atteint une certaine taille :) Et c'est la fin de notre leçon ! Aujourd'hui, vous avez découvert un sujet très important et ces connaissances vous seront certainement utiles dans votre travail futur. À la prochaine! :)
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION