Mam nadzieję, że Log4j nie potrzebuje żadnego wprowadzenia i zakładam, że masz już podstawowe zrozumienie Log4j. Jeśli nie, polecam najpierw przeczytać ten samouczek Log4j, aby zacząć.
To powiedziawszy, zacznę teraz od MDC lub Mapped Diagnostic Context. Nie przestrasz się tej nazwy! MDC nie jest takie trudne. Jest to prosta, ale użyteczna koncepcja. Zanim wyjaśnię czym jest MDC, załóżmy, że będziemy rozwijać prostą aplikację internetową z jednym serwletem MyServlet
, który obsługuje żądania od wielu klientów. Serwlet ten używa log4j framework do logowania. Plik appender został zdefiniowany dla tego serwletu, więc wszystkie komunikaty dziennika będą logowane do pliku tekstowego.
Z powyższej konfiguracji, wszystkie komunikaty dziennika z MyServlet
trafi do jednego pliku dziennika. A kiedy ten serwlet obsługuje więcej niż jednego klienta w tym samym czasie, oświadczenia dziennika będą mieszane i nie ma sposobu, aby odróżnić, które oświadczenie dziennika należy do przetwarzania którego klienta. This’ll make it difficult to trace and debug if any processing error occured in MyServlet
life cycle.
How to differentiate log statements with respective to each clients?
Aby uniknąć mieszania log statements, możemy dodać nazwę użytkownika (lub inne dane, które będą unikalne dla każdego klienta) do naszych log statements. Aby to zrobić, musimy upewnić się, że przekazujemy dane o nazwie użytkownika w sposób jawny do każdego logu, co jest żmudną i powtarzalną pracą. Ale, nie ma się czym martwić! Log4j ma doskonały sposób, aby przezwyciężyć ten problem. Nazywa się to MDC lub Mapped Diagnostic Context.
Co to jest Log4j MDC (Mapped Diagnostic Context)
Ujmując to prosto, MDC jest mapą, która przechowuje dane kontekstu konkretnego wątku, w którym kontekst jest uruchomiony. Aby to wyjaśnić, wróćmy do naszej prostej aplikacji – każde żądanie klienta będzie obsługiwane przez inny wątek MyServlet
. Więc, jeśli używasz log4j do logowania, wtedy każdy wątek może mieć swój własny MDC, który jest globalny dla całego wątku. Każdy kod, który jest częścią tego wątku, może łatwo uzyskać dostęp do wartości, które są obecne w MDC wątku.
Jak więc zrobić MDC, aby odróżnić oświadczenia logowania od wielu klientów? Proste: Przed rozpoczęciem jakiegokolwiek procesu biznesowego w twoim kodzie, pobierz nazwę użytkownika (dla naszego Servleta, możemy ją pobrać z obiektu request
) i umieść ją w MDC. Teraz nazwa użytkownika będzie dostępna dla dalszego przetwarzania. W twoim log4j.properties podczas definiowania conversionPattern
, dodaj wzorzec %X{key}
aby pobrać wartości, które są obecne w MDC. Kluczem będzie userName w naszym przykładzie. To tak jak pobieranie wartości z obiektu Session.