Sper că Log4j nu are nevoie de nici o introducere și presupun că aveți deja cunoștințe de bază despre Log4j. Dacă nu, vă voi recomanda să citiți mai întâi acest Tutorial Log4j, pentru a începe.
Acestea fiind spuse, acum voi începe cu MDC sau Mapped Diagnostic Context. Nu vă speriați de acest nume! MDC nu este atât de greu. Este un concept simplu, dar util. Înainte de a explica ce este MDC, să presupunem că vom dezvolta o aplicație web simplă cu un servlet MyServlet
care servește cereri de la mai mulți clienți. Și, acest servlet utilizează cadrul log4j pentru logare. Pentru acest servlet a fost definit un fișier appender, astfel încât toate mesajele de jurnal vor fi înregistrate într-un fișier text.
Cu configurația menționată mai sus, toate mesajele de jurnal de la MyServlet
vor merge într-un singur fișier de jurnal. Iar atunci când acest servlet deservește mai mulți clienți în același timp, declarațiile de jurnal vor fi amestecate și nu există nicio modalitate de a diferenția care declarație de jurnal aparține procesării fiecărui client în parte. Acest lucru va îngreuna urmărirea și depanarea în cazul în care a apărut o eroare de procesare în ciclul de viață MyServlet
.
Cum să diferențiem declarațiile de jurnal în funcție de fiecare client?
Pentru a evita amestecul declarațiilor de jurnal, am putea adăuga un nume de utilizator (sau alte date care vor fi unice pentru fiecare client) la declarațiile noastre de jurnal. Pentru a face acest lucru, trebuie să ne asigurăm că transmitem explicit aceste date de nume de utilizator la fiecare declarație de jurnal, ceea ce reprezintă o muncă plictisitoare și repetitivă. Dar, nu trebuie să vă faceți griji! Log4j are o modalitate excelentă de a depăși această problemă. Se numește MDC sau Mapped Diagnostic Context.
Atunci, ce este Log4j MDC (Mapped Diagnostic Context)
Pentru a simplifica, MDC este o hartă care stochează datele de context ale firului particular în care se execută contextul. Pentru a-l explica, revenim la aplicația noastră simplă – fiecare cerere a clientului va fi servită de un fir diferit al MyServlet
. Așadar, dacă folosiți log4j pentru logare, atunci fiecare fir poate avea propriul MDC care este global pentru întregul fir. Orice cod care face parte din acel fir poate accesa cu ușurință valorile care sunt prezente în MDC-ul firului.
Atunci, cum facem ca MDC să diferențieze declarațiile de logare de la mai mulți clienți? Simplu : Înainte de a începe orice proces de afaceri în codul dumneavoastră, obțineți numele de utilizator (pentru Servlet-ul nostru, îl putem obține din obiectul request
) și puneți-l în MDC. Acum, numele de utilizator va fi disponibil pentru procesarea ulterioară. În log4j.properties, în timp ce definiți conversionPattern
, adăugați un model %X{key}
pentru a prelua valorile care sunt prezente în MDC. Cheia va fi userName în exemplul nostru. Este ca și cum ați obține o valoare dintr-un obiect Session.
.