2007-10-25

MDC

Nemrég egy szerveralkalmazás logjának minden egyes sorában fel kellett tüntetnem az éppen csatlakozott kliens IP-címét. Nagyon régen ezt úgy csináltuk, hogy bevezettünk egy kötött log message formátumot, amibe szeparátorokkal bele volt téve a szükséges információ. Tudom hogy ez ronda megoldás. Mivel most adatbázisba kellett loggolni, -ahol külön oszlop kellett az IP címre- ez nem lett volna (könnyen) járható út.

Szerencsére Java 1.2 óta használható a log4j MDC (Mapped Diagnostic Context) nevű megoldása, ami InheritableThreadLocal-ba teszi a kívánt információkat egy Hashtable-be. Ilyen egyszerűen lehet betenni az információt a java kódban:

MDC.put("ip", ipaddress);

Az InheritableThreadLocal lényege, hogy az adott szálból kreált szálak átveszik a szülő szálhoz ily módon csatolt változókat. Szerver alkalmazásoknál -főleg ahol egy szálcsoport szolgál ki egy klienst- eszményi megoldás. A konfigban a ConversionPattern-ben a %X{propname} kifejezéssel lehet kinyerni a betett információkat. Egy külső modul loggolásába is be lehet illeszteni ezeket az MDC-ket anélkül, hogy a külső modul kódjába beleírnánk. Ha pl. Hibernate-et használunk és megfelelően állítjuk be a konfigot, a belső Hibernate logokban is látszani fog az MDC, pl. hogy melyik kliensre vonatkozik az adott Hibernate művelet.

A múltkor idézett cikkben van példa az MDC és az NDC (Nested Diagnostic Context) használatára. Az NDC az MDC verem stílusú változata.

Azt írják ügyelni kell rá, hogy a szálak befejezésekor az MDC-k és NDC-k tartalmát töröljük, különben az így eltárolt információkat a GC nem tudja kilapátolni a memóriából. Swing-gel is használtam és nem működött teljesen zökkenőmentesen. Néha nem került bele a szükséges információ a logba, de ez annak a számlájára is írható, hogy nem mélyedtem még bele nagyon a Swing szálkezelésébe. (De már kéne.)

A logBack-ban is lesz MDC támogatás, bár a Google egyelőre Bug-okat ad ki első találatnak a témában. Az slf4j támogatja, viszont a JCL nem, ahogy ez az írás említi. A java logging api-ról most hirtelen nem sikerült kiderítenem hogy támogatja-e, de az iménti írás szerint valószínűleg nem.

Nincsenek megjegyzések: