Ik hoop dat Log4j geen introductie nodig heeft en ik ga ervan uit dat je al een basiskennis van Log4j hebt. Zo niet, dan raad ik je aan om eerst deze Log4j Tutorial te lezen, om te beginnen.
Dat gezegd hebbende, zal ik nu beginnen met MDC of Mapped Diagnostic Context. Laat je niet afschrikken door deze naam! MDC is niet zo moeilijk. Het is een eenvoudig maar nuttig concept. Voordat ik uitleg wat MDC is, neem ik aan dat we een eenvoudige web applicatie gaan ontwikkelen met een servlet MyServlet
die verzoeken van meerdere clients serveert. En, deze servlet gebruikt log4j framework voor logging. Voor deze servlet is een file appender gedefinieerd, zodat alle log-berichten in een tekstbestand worden gelogd.
Met de bovenstaande configuratie zullen alle log-berichten van MyServlet
in een enkel log-bestand terecht komen. En als deze servlet meer dan een client tegelijk bedient, zullen de logboek boodschappen gemengd worden en is er geen manier om te onderscheiden welke logboek boodschap bij welke client hoort. Dit maakt het moeilijk om te achterhalen en te debuggen als er een fout optreedt in de MyServlet
life cycle.
Hoe differentieer ik log verklaringen met betrekking tot elke client?
Om te voorkomen dat de log verklaringen door elkaar lopen, kunnen we een gebruikersnaam (of een ander gegeven dat uniek is voor elke client) aan onze log verklaringen toevoegen. Om dit te doen, moeten we er voor zorgen dat we deze gebruikersnaam expliciet doorgeven aan elk logboek bericht, wat een vervelend en repetitief werk is. Maar, geen nood! Log4j heeft een uitstekende manier om dit te ondervangen. Het heet als MDC of Mapped Diagnostic Context.
Dus, Wat is Log4j MDC (Mapped Diagnostic Context)
Om het eenvoudig te zeggen, de MDC is een map die de context gegevens van de specifieke draad waar de context wordt uitgevoerd opslaat. Om het uit te leggen, kom terug naar onze eenvoudige toepassing – elke client aanvraag zal worden geserveerd door verschillende thread van de MyServlet
. Dus, als je log4j gebruikt voor logging, dan kan elke thread zijn eigen MDC hebben die globaal is voor de hele thread. Elke code die deel uitmaakt van die draad kan gemakkelijk toegang krijgen tot de waarden die aanwezig zijn in MDC van de draad.
Dus, hoe maken we MDC om logging verklaringen van meerdere klanten te onderscheiden? Simpel: voordat je een bedrijfsproces in je code start, vraag je de gebruikersnaam op (voor onze Servlet kunnen we die uit het request
-object halen) en zet je die in MDC. Nu zal de gebruikersnaam beschikbaar zijn voor de verdere verwerking. In je log4j.properties, terwijl je de conversionPattern
definieert, voeg je een patroon %X{key}
toe om de waarden op te halen die in de MDC aanwezig zijn. De sleutel zal in ons voorbeeld userName zijn. Het is alsof je een waarde uit een Session object haalt.