Jeg håber ikke, at Log4j behøver nogen introduktion, og jeg går ud fra, at du allerede har en grundlæggende forståelse af Log4j. Hvis ikke, vil jeg anbefale dig først at læse denne Log4j Tutorial, for at komme i gang.

Det sagt, vil jeg nu starte med MDC eller Mapped Diagnostic Context. Du skal ikke blive skræmt af dette navn! MDC er ikke så svært. Det er et simpelt, men nyttigt koncept. Før jeg forklarer, hvad MDC er, lad os antage, at vi skal udvikle en simpel webapplikation med én servlet MyServlet, der betjener forespørgsler fra flere klienter. Og denne servlet bruger log4j-rammen til logning. Der er defineret en filappender for denne servlet, så alle logmeddelelser vil blive logget i en tekstfil.

Med ovenstående konfiguration vil alle logmeddelelser fra MyServlet gå ind i en enkelt logfil. Og når denne servlet betjener flere klienter på samme tid, vil logmeddelelserne blive blandet, og der er ingen måde at skelne mellem, hvilken logmeddelelse der hører til hvilken klientbehandling. Dette vil gøre det vanskeligt at spore og fejlfinde, hvis der opstår en behandlingsfejl i MyServlet livscyklus.

Hvordan kan man skelne logudtalelser med respektive til de enkelte klienter?

For at undgå at logudtalelser blandes sammen, kan vi tilføje et brugernavn (eller andre data, som vil være unikke for hver klient) til vores logudtalelser. For at gøre dette skal vi sørge for, at vi eksplicit videregiver disse brugernavnedata til hver enkelt logudtalelse, hvilket er et kedeligt og gentagende arbejde. Men, ingen grund til at bekymre sig! Log4j har en fremragende måde at overvinde dette på. Det kaldes MDC eller Mapped Diagnostic Context.

Så, hvad er Log4j MDC (Mapped Diagnostic Context)

For at gøre det enkelt, er MDC et kort, som gemmer kontekstdataene for den bestemte tråd, hvor konteksten kører. For at forklare det, skal vi vende tilbage til vores enkle applikation – hver klientforespørgsel vil blive betjent af en anden tråd i MyServlet. Så hvis du bruger log4j til logning, kan hver tråd have sin egen MDC, som er global for hele tråden. Enhver kode, der er en del af den pågældende tråd, kan nemt få adgang til de værdier, der er til stede i trådens MDC.

Så, hvordan laver vi MDC til at skelne logningsangivelser fra flere klienter? Simpelt : Før du starter en forretningsproces i din kode, skal du hente brugernavnet (for vores Servlet kan vi hente det fra request-objektet) og sætte det ind i MDC. Nu vil brugernavnet være tilgængeligt for den videre behandling. I din log4j.properties, mens du definerer conversionPattern, skal du tilføje et mønster %X{key} for at hente de værdier, der er til stede i MDC’en. Nøglen vil være userName i vores eksempel. Det er som at hente en værdi fra et Session-objekt.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.