J’espère que Log4j n’a pas besoin d’introduction et je suppose que vous avez déjà une compréhension de base de Log4j. Si ce n’est pas le cas, je vous recommanderai de lire d’abord ce tutoriel Log4j, pour commencer.
Cela dit, maintenant je vais commencer avec MDC ou Mapped Diagnostic Context. N’ayez pas peur avec ce nom ! MDC n’est pas si difficile. C’est un concept simple mais utile. Avant d’expliquer ce qu’est MDC, supposons que nous allons développer une application web simple avec une servlet MyServlet
qui sert les demandes de plusieurs clients. Et, cette servlet utilise le framework log4j pour la journalisation. Un appender de fichier a été défini pour cette servlet, de sorte que tous les messages de journalisation seront enregistrés dans un fichier texte.
Avec la configuration susmentionnée, tous les messages de journalisation de MyServlet
iront dans un seul fichier de journalisation. Et lorsque cette servlet sert plus d’un client en même temps, les déclarations de journal seront mélangées et il n’y a aucun moyen de différencier quelle déclaration de journal appartient au traitement de quel client. Cela rendra difficile la traçabilité et le débogage si une erreur de traitement s’est produite dans le cycle de vie MyServlet
.
Comment différencier les déclarations de journal avec respectifs à chaque clients?
Pour éviter le mélange des déclarations de journal, nous pourrions ajouter un nom d’utilisateur (ou une autre donnée qui sera unique à chaque client) à nos déclarations de journal. Pour ce faire, nous devons nous assurer que nous passons cette donnée de nom d’utilisateur explicitement à chaque déclaration de journal, ce qui est un travail fastidieux et répétitif. Mais, pas besoin de s’inquiéter ! Log4j a un excellent moyen de surmonter ce problème. Il est appelé comme MDC ou Mapped Diagnostic Context.
So, What is Log4j MDC (Mapped Diagnostic Context)
Pour faire simple, le MDC est une carte qui stocke les données de contexte du thread particulier où le contexte est en cours d’exécution. Pour l’expliquer, revenons à notre application simple – chaque requête client sera servie par un thread différent du MyServlet
. Donc, si vous utilisez log4j pour la journalisation, alors chaque thread peut avoir son propre MDC qui est global à l’ensemble du thread. Tout code qui fait partie de ce thread peut facilement accéder aux valeurs qui sont présentes dans le MDC du thread.
Alors, comment faire pour que le MDC différencie les déclarations de journalisation de plusieurs clients ? C’est simple : avant de lancer un processus métier dans votre code, obtenez le nom de l’utilisateur (pour notre Servlet, nous pouvons l’obtenir à partir de l’objet request
) et mettez-le dans le MDC. Maintenant le nom d’utilisateur sera disponible pour le traitement ultérieur. Dans votre log4j.properties en définissant le conversionPattern
, ajoutez un pattern %X{key}
pour récupérer les valeurs qui sont présentes dans le MDC. La clé sera userName dans notre exemple. C’est comme obtenir une valeur à partir d’un objet Session.