Remélem, hogy a Log4j nem szorul bevezetésre, és feltételezem, hogy már rendelkezik alapvető ismeretekkel a Log4j-ről. Ha nem, akkor javaslom, hogy először olvassa el ezt a Log4j Tutorial-t, hogy elkezdhesse.
Ezt elmondva, most az MDC-vel vagy Mapped Diagnostic Context-tel kezdem. Ne ijedj meg ettől a névtől! Az MDC nem olyan nehéz. Ez egy egyszerű, mégis hasznos koncepció. Mielőtt elmagyaráznám, mi az az MDC, tegyük fel, hogy egy egyszerű webes alkalmazást fogunk fejleszteni egy MyServlet
szervlettel, amely több kliens kéréseit szolgálja ki. És ez a szervlet log4j keretrendszert használ naplózásra. Ehhez a szervlethez definiáltunk egy file appendert, így az összes naplóüzenet egy szöveges fájlba fog naplózódni.
A fenti konfigurációval a MyServlet
összes naplóüzenete egyetlen naplófájlba fog kerülni. És amikor ez a szervlet egyszerre több ügyfelet szolgál ki, a naplóbejegyzések keveredni fognak, és nem lehet megkülönböztetni, hogy melyik naplóbejegyzés melyik ügyfél feldolgozásához tartozik. Ez megnehezíti a nyomon követést és a hibakeresést, ha bármilyen feldolgozási hiba történt az MyServlet
életciklusban.
Hogyan lehet megkülönböztetni az egyes ügyfelekhez tartozó naplóbejegyzéseket?
A naplóbejegyzések keveredésének elkerülése érdekében hozzáadhatunk egy felhasználónevet (vagy más adatot, amely minden ügyfélhez egyedi) a naplóbejegyzésekhez. Ehhez meg kell győződnünk arról, hogy ezt a felhasználónév-adatot explicit módon átadjuk minden egyes log-kijelentésnek, ami fárasztó és ismétlődő munka. De nem kell aggódni! A Log4j-nek van egy kiváló módja ennek leküzdésére. Ezt úgy hívják, hogy MDC vagy Mapped Diagnostic Context.
Szóval, mi az a Log4j MDC (Mapped Diagnostic Context)
Egyszerűen fogalmazva, az MDC egy térkép, amely annak az adott szálnak a kontextusadatait tárolja, ahol a kontextus fut. A magyarázathoz térjünk vissza az egyszerű alkalmazásunkhoz – minden ügyfélkérést a MyServlet
különböző szála fog kiszolgálni. Tehát, ha log4j-t használunk naplózásra, akkor minden szálnak lehet saját MDC-je, ami globális az egész szál számára. Bármely kód, amely része az adott szálnak, könnyen hozzáférhet a szál MDC-jében lévő értékekhez.
Szóval, hogyan tehetjük az MDC-t úgy, hogy megkülönböztesse a több ügyféltől származó naplózási utasításokat? Egyszerű : Mielőtt bármilyen üzleti folyamatot elindítanánk a kódunkban, szerezzük meg a felhasználónevet (a mi Servletünk esetében a request
objektumból kaphatjuk meg), és tegyük be az MDC-be. Mostantól a felhasználónév elérhető lesz a további feldolgozáshoz. A log4j.properties-ben a conversionPattern
definiálásakor adjunk hozzá egy %X{key}
mintát az MDC-ben lévő értékek lekérdezéséhez. A kulcs a mi példánkban a userName lesz. Ez olyan, mintha egy értéket kapnánk egy Session objektumból.