Java naplózás beágyazott diagnosztikai kontextussal (NDC)

1. Áttekintés

A beágyazott diagnosztikai kontextus (NDC) egy olyan mechanizmus, amely segít megkülönböztetni az egymásba illesztett naplóüzeneteket különböző forrásoktól. Az NDC ezt azzal teszi lehetővé, hogy megkülönböztető kontextuális információkat adjon hozzá az egyes naplóbejegyzésekhez.

Ebben a cikkben megvizsgáljuk az NDC használatát és használatát / támogatását a különböző Java naplózási keretrendszerekben.

2. Diagnosztikai összefüggések

Egy tipikus többszálú alkalmazásban, például egy webalkalmazásban vagy a REST API-kban, az egyes ügyfélkéréseket egy másik szál szolgálja ki. Az ilyen alkalmazásból létrehozott naplók az összes ügyfélkérés és forrás keverékét képezik. Ez megnehezíti a naplók üzleti értelmezését vagy hibakeresését.

A beágyazott diagnosztikai kontextus (NDC) egy kontextusinformáció-köteget kezel, szálanként. Az NDC-ben lévő adatok a kód minden napló-kérelméhez hozzáférhetők, és konfigurálhatók minden napló-üzenettel történő naplózásra - még azokon a helyeken is, ahol az adatok nem tartoznak a hatókörbe. Az egyes naplóüzenetek ezen kontextuális információi segítenek megkülönböztetni a naplókat a forrása és a kontextusa szerint.

A leképezett diagnosztikai kontextus (MDC) szintén szálanként kezeli az információkat, de térképként.

3. Az NDC verem egy minta alkalmazásban

Az NDC verem használatának bemutatásához vegyünk egy példát egy REST API-ra, amely pénzt küld befektetési számlára.

A bemenetként szükséges információt egy Beruházás osztály:

public class Investment {private String ügyletId; magánhúr-tulajdonos; magán Hosszú összeg; állami befektetés (karakterlánc-tranzakcióazonosító, karakterlánc-tulajdonos, hosszú összeg) {this.transactionId = ügyletazonosító; ez.tulajdonos = tulajdonos; ez.összeg = összeg; } // szokásos mérőeszközök és beállítók}

A befektetési számlára történő átutalás a InvestmentService. Ezen osztályok teljes forráskódja megtalálható ebben a github projektben.

A minta alkalmazásban az adatok Tranzakció azonosítója és tulajdonos az NDC verembe kerülnek, abban a szálban, amely egy adott kérést feldolgoz. Ezek az adatok a szál minden naplóüzenetében elérhetők. Így minden egyedi tranzakció nyomon követhető, és azonosítható az egyes naplóüzenetek releváns kontextusa.

4. NDC a Log4j-ben

A Log4j egy úgynevezett osztályt nyújt NDC amely statikus módszereket biztosít az adatok kezelésére az NDC veremben. Alapvető használat:

  • Kontextus beírásakor használja a NDC.push () kontextusadatok hozzáadásához az aktuális szálhoz
  • A kontextus elhagyásakor használja NDC.pop () hogy kivegye a kontextus adatait
  • Amikor kilép a szálból, hívjon NDC.remove () a szál diagnosztikai kontextusának eltávolítása és a memória felszabadulásának biztosítása (a Log4j 1.3-tól már nem szükséges)

A minta alkalmazásban az NDC segítségével kontextusadatokat adhatunk hozzá / távolíthatunk el a kód megfelelő helyein:

import org.apache.log4j.NDC; @RestController public class Log4JController {@Autowired @Qualifier ("Log4JInvestmentService") private InvestmentService log4jBusinessService; @RequestMapping (value = "/ ndc / log4j", method = RequestMethod.POST) public ResponseEntity postPayment (@RequestBody Investment Investment) {NDC.push ("tx.id =" + Investment.getTransactionId ()); NDC.push ("tx.owner =" + befektetés.getOwner ()); log4jBusinessService.transfer (befektetés.getAmount ()); NDC.pop (); NDC.pop (); NDC.remove (); új ResponseEntity (befektetés, HttpStatus.OK) megtérülése; }}

Az NDC tartalma naplóüzenetekben jeleníthető meg a használatával %x opció a ConversionPattern appender használta log4j.tulajdonságok:

log4j.appender.consoleAppender.layout.ConversionPattern =% -4r [% t]% 5p% c {1} -% m - [% x]% n

Telepítsük a REST API-t tomcat-ra. Minta kérés:

POST / logging-service / ndc / log4j {"tranzakcióazonosító": "4", "tulajdonos": "Marc", "összeg": 2000}

Láthatjuk a diagnosztikai kontextus információkat a napló kimenetében:

48569 [http-nio-8080-exec-3] INFO Log4JInvestmentService - Felkészülés a 2000 $ átutalásra. - [tx.id = 4 tx.owner = Marc] 49231 [http-nio-8080-exec-4] INFO Log4JInvestmentService - Felkészülés 1500 $ átutalására. - [tx.id = 6 tx.owner = Samantha] 49334 [http-nio-8080-exec-3] INFO Log4JInvestmentService - Sikeresen befejeződött a 2000 $ átvitele? igaz. - [tx.id = 4 tx.owner = Marc] 50023 [http-nio-8080-exec-4] INFO Log4JInvestmentService - Az 1500 $ átutalása sikeresen befejeződött? igaz. - [tx.id = 6 tx. tulajdonos = Samantha] ...

5. NDC a Log4j 2-ben

A Log4j 2 NDC-jét Thread Context Stack-nek hívják:

import org.apache.logging.log4j.ThreadContext; @RestController public class Log4J2Controller {@Autowired @Qualifier ("Log4J2InvestmentService") private InvestmentService log4j2BusinessService; @RequestMapping (value = "/ ndc / log4j2", method = RequestMethod.POST) public ResponseEntity postPayment (@RequestBody Investment Investment) {ThreadContext.push ("tx.id =" + Investment.getTransactionId ()); ThreadContext.push ("tx.owner =" + befektetés.getOwner ()); log4j2BusinessService.transfer (befektetés.getAmount ()); ThreadContext.pop (); ThreadContext.pop (); ThreadContext.clearAll (); új ResponseEntity (befektetés, HttpStatus.OK) megtérülése; }}

Csakúgy, mint a Log4j esetében, használjuk a %x opciót a Log4j 2 konfigurációs fájlban log4j2.xml:

Napló kimenet:

204724 [http-nio-8080-exec-1] INFO Log4J2InvestmentService - Felkészülés 1500 $ átutalására. - [tx.id = 6, tx.owner = Samantha] 205455 [http-nio-8080-exec-2] INFO Log4J2InvestmentService - Felkészülés a 2000 $ átadására. - [tx.id = 4, tx.owner = Marc] 205525 [http-nio-8080-exec-1] INFO Log4J2InvestmentService - Sikeresen befejeződött az 1500 $ átutalás? hamis. - [tx.id = 6, tx.owner = Samantha] 206064 [http-nio-8080-exec-2] INFO Log4J2InvestmentService - Sikeresen befejeződött a 2000 $ átvitele? igaz. - [tx.id = 4, tx.owner = Marc] ...

6. NDC naplózási homlokzatokban (JBoss naplózás)

Az SLF4J-hoz hasonló fakitermelési homlokzatok integrálják a különféle fakitermelési kereteket. Az NDC-t az SLF4J nem támogatja (de az slf4j-ext modul tartalmazza). A JBoss Logging egy naplózási híd, akárcsak az SLF4J. Az NDC támogatott a JBoss Logging szolgáltatásban.

Alapértelmezés szerint a JBoss Logging megkeresi a ClassLoader a háttér / szolgáltatók elérhetőségéről a következő sorrendben: JBoss LogManager, Log4j 2, Log4j, SLF4J és JDK Logging.

A JBoss LogManager naplózási szolgáltatóként általában a WildFly alkalmazáskiszolgálón belül található. Esetünkben a JBoss naplózási híd elsőbbségi sorrendben választja a következőt (ami Log4j 2), mint naplózási szolgáltató.

Kezdjük azzal, hogy összeadjuk a szükséges függőséget pom.xml:

 org.jboss.logging jboss-logging 3.3.0.Végső 

A függőség legfrissebb verziója itt ellenőrizhető.

Adjunk hozzá kontextuális információkat az NDC veremhez:

import org.jboss.logging.NDC; @RestController public class JBossLoggingController {@Autowired @Qualifier ("JBossLoggingInvestmentService") private InvestmentService jbossLoggingBusinessService; @RequestMapping (value = "/ ndc / jboss-logging", method = RequestMethod.POST) public ResponseEntity postPayment (@RequestBody Investment Investment) {NDC.push ("tx.id =" + Investment.getTransactionId ()); NDC.push ("tx.owner =" + befektetés.getOwner ()); jbossLoggingBusinessService.transfer (befektetés.getAmount ()); NDC.pop (); NDC.pop (); NDC.clear (); hozd vissza az új ResponseEntity-t (befektetés, HttpStatus.OK); }}

Napló kimenete:

17045 [http-nio-8080-exec-1] INFO JBossLoggingInvestmentService - Felkészülés 1 500 USD átutalására. - [tx.id = 6, tx.owner = Samantha] 17725 [http-nio-8080-exec-1] INFO JBossLoggingInvestmentService - 1500 $ átutalása sikeresen befejeződött? igaz. - [tx.id = 6, tx.owner = Samantha] 18257 [http-nio-8080-exec-2] INFO JBossLoggingInvestmentService - Felkészülés 2 000 USD átutalására. - [tx.id = 4, tx.owner = Marc] 18904 [http-nio-8080-exec-2] INFO JBossLoggingInvestmentService - 2000 $ átutalása sikeresen befejeződött? igaz. - [tx.id = 4, tx.owner = Marc] ...

7. Következtetés

Láttuk, hogy a diagnosztikai kontextus hogyan segít értelmezhető módon összekapcsolni a naplókat - üzleti szempontból, valamint hibakeresés céljából. Felbecsülhetetlen technika a fakitermelés gazdagítására, különösen a többszálas alkalmazásokban.

Az ebben a cikkben használt példa megtalálható a Github projektben.