Toivottavasti Log4j ei kaipaa esittelyä ja oletan, että sinulla on jo perusymmärrys Log4j:stä. Jos ei, suosittelen sinua lukemaan ensin tämän Log4j Tutorialin, jotta pääset alkuun.
Sen jälkeen aloitan nyt MDC:stä eli Mapped Diagnostic Contextista. Älä säikähdä tätä nimeä! MDC ei ole niin vaikea. Se on yksinkertainen mutta hyödyllinen käsite. Ennen kuin selitän, mikä on MDC, oletetaan, että aiomme kehittää yksinkertaisen web-sovelluksen, jossa on yksi servlet MyServlet
, joka palvelee pyyntöjä useilta asiakkailta. Ja tämä servletti käyttää log4j-kehystä kirjaamiseen. Tälle servletille on määritelty tiedostosovitin, joten kaikki lokiviestit kirjataan tekstitiedostoon.
Yllä mainitulla konfiguraatiolla kaikki MyServlet
:n lokiviestit menevät yhteen lokitiedostoon. Ja kun tämä servlet palvelee useampaa kuin yhtä asiakasta samaan aikaan, lokilausumat sekoittuvat, eikä ole mitään keinoa erottaa, mikä lokilausuma kuuluu minkäkin asiakkaan käsittelyyn. Tämä vaikeuttaa jäljittämistä ja virheenkorjausta, jos MyServlet
elinkaaren aikana tapahtuu jokin käsittelyvirhe.
Miten lokilausekkeet erotetaan toisistaan kunkin asiakkaan osalta?
Jotta vältyttäisiin lokilausekkeiden sekoittumiselta, voitaisiin lokilausekkeisiin lisätä käyttäjänimi (tai jokin muu tieto, joka on yksilöllinen jokaiselle asiakkaalle). Tätä varten meidän on varmistettava, että välitämme tämän käyttäjänimitiedon eksplisiittisesti jokaiseen lokilausumaan, mikä on työlästä ja toistuvaa työtä. Mutta ei syytä huoleen! Log4j:ssä on erinomainen tapa ratkaista tämä ongelma. Sitä kutsutaan nimellä MDC eli Mapped Diagnostic Context.
Mikä on Log4j MDC (Mapped Diagnostic Context)
Yksinkertaisesti sanottuna MDC on kartta, joka tallentaa kontekstin tiedot tietystä säikeestä, jossa konteksti on käynnissä. Selittääksemme sen, palataan yksinkertaiseen sovellukseemme – jokaista asiakaspyyntöä palvellaan MyServlet
eri säikeellä. Jos siis käytät log4j:tä kirjaamiseen, jokaisella säikeellä voi olla oma MDC, joka on globaali koko säikeelle. Mikä tahansa koodi, joka on osa kyseistä säiettä, pääsee helposti käsiksi arvoihin, jotka ovat säikeen MDC:ssä.
Miten siis teemme MDC:n erottamaan useiden asiakkaiden lokilausekkeet toisistaan? Yksinkertaista : Ennen kuin aloitat minkä tahansa liiketoimintaprosessin koodissasi, hanki käyttäjän nimi (meidän Servletissämme voimme saada sen request
-objektista) ja laita se MDC:hen. Nyt käyttäjänimi on käytettävissä jatkokäsittelyssä. Lisää log4j.properties-tiedostoon conversionPattern
:n määrittelyn yhteydessä malli %X{key}
, jolla haetaan MDC:ssä olevat arvot. Avain on esimerkissämme userName. Se on kuin hakisi arvon Session-objektista.