Doufám, že Log4j není třeba představovat a předpokládám, že základní znalosti Log4j již máte. Pokud ne, doporučím vám, abyste si nejprve přečetli tento výukový kurz Log4j, abyste mohli začít.
Takže, nyní začnu s MDC neboli Mapovaným diagnostickým kontextem. Nenechte se vyděsit tímto názvem! MDC není tak těžké. Je to jednoduchý, ale užitečný koncept. Než vysvětlím, co je MDC, předpokládejme, že budeme vyvíjet jednoduchou webovou aplikaci s jedním servletem MyServlet
, který obsluhuje požadavky od více klientů. A tento servlet používá pro logování framework log4j. Pro tento servlet byl definován apender souboru, takže všechny zprávy protokolu budou zaznamenávány do textového souboru.
Při výše uvedené konfiguraci budou všechny zprávy protokolu z MyServlet
přecházet do jediného souboru protokolu. A pokud tento servlet obsluhuje více klientů najednou, budou se zprávy protokolu míchat a nebude možné rozlišit, která zpráva protokolu patří ke zpracování kterého klienta. To ztíží sledování a ladění, pokud se v MyServlet
životním cyklu vyskytne nějaká chyba při zpracování.
Jak rozlišit výpisy protokolu příslušné jednotlivým klientům?
Aby se výpisy protokolu nemíchaly, mohli bychom do výpisů protokolu přidat uživatelské jméno (nebo jiný údaj, který bude pro každého klienta jedinečný). K tomu musíme zajistit, abychom tento údaj o uživatelském jménu explicitně předávali každému příkazu protokolu, což je zdlouhavá a opakovaná práce. Ale není třeba se obávat! Log4j nabízí vynikající způsob, jak tento problém překonat. Nazývá se MDC neboli Mapovaný diagnostický kontext.
Takže, co je Log4j MDC (Mapovaný diagnostický kontext)
Zjednodušeně řečeno, MDC je mapa, která uchovává kontextová data konkrétního vlákna, kde kontext běží. Pro vysvětlení se vraťme k naší jednoduché aplikaci – každý požadavek klienta bude obsloužen jiným vláknem MyServlet
. Pokud tedy používáte log4j pro logování, pak každé vlákno může mít svůj vlastní MDC, který je globální pro celé vlákno. Jakýkoli kód, který je součástí tohoto vlákna, může snadno přistupovat k hodnotám, které se nacházejí v MDC vlákna.
Jak tedy udělat MDC, aby rozlišoval logovací příkazy od více klientů? Jednoduše : Před spuštěním jakéhokoli obchodního procesu ve svém kódu získejte jméno uživatele (pro náš Servlet ho můžeme získat z objektu request
) a vložte ho do MDC. Nyní bude uživatelské jméno k dispozici pro další zpracování. Ve svém souboru log4j.properties při definování objektu conversionPattern
přidejte vzor %X{key}
pro načtení hodnot, které se nacházejí v MDC. Klíčem bude v našem příkladu userName. Je to jako získávání hodnoty z objektu Session.
.