רישום ג'אווה עם הקשר אבחוני מקונן (NDC)

1. סקירה כללית

הקשר אבחוני מקונן (NDC) הוא מנגנון המסייע להבחין בהודעות יומן משולבות ממקורות שונים. NDC עושה זאת על ידי מתן אפשרות להוסיף מידע קונטקסטואלי ייחודי לכל ערך יומן.

במאמר זה נחקור את השימוש ב- NDC והשימוש בו / תמיכה במסגרות רישום Java שונות.

2. קשרי אבחון

ביישום אופייני רב-שרשור כמו יישום אינטרנט או ממשקי API של REST, כל בקשת לקוח מוגשת על ידי שרשור אחר. היומנים שנוצרים מיישום כזה יהיו שילוב של כל בקשות הלקוחות והמקורות. זה מקשה על הבנת עסק כלשהי ביומנים או באגים.

הקשר האבחוני המקונן (NDC) מנהל ערימה של מידע קונטקסטואלי, על בסיס אשכול. הנתונים ב- NDC זמינים לכל בקשת יומן בקוד וניתן להגדיר אותם להיכנס עם כל הודעת יומן - גם במקומות שהנתונים אינם בהיקף. מידע קונטקסטואלי זה בכל הודעת יומן עוזר להבחין ביומנים לפי המקור וההקשר שלו.

הקשר האבחוני הממופה (MDC) מנהל מידע גם על בסיס פתיל, אך כמפה.

3. ערימת ה- NDC ביישום לדוגמא

כדי להדגים את השימוש בערמת NDC, ניקח דוגמה ל- REST API ששולח כסף לחשבון השקעה.

המידע הנדרש כקלט מיוצג ב- הַשׁקָעָה מעמד:

השקעה ברמה הציבורית {פרטי מחרוזת מזהה; בעל מחרוזת פרטי; סכום פרטי פרטי; השקעה ציבורית (מחרוזת עסקית, בעל מחרוזת, סכום ארוך) {this.transactionId = transactionId; this.owner = בעלים; this.amount = סכום; } // גטרים וקובעים סטנדרטיים}

ההעברה לחשבון ההשקעה מתבצעת באמצעות InvestmentService. קוד המקור המלא לשיעורים אלה ניתן למצוא בפרויקט github זה.

ביישום לדוגמה, הנתונים מזהה עסקה ו בעלים ממוקמים בערמת NDC, בשרשור העיבוד של בקשה נתונה. נתונים אלה זמינים בכל הודעת יומן בשרשור זה. בדרך זו ניתן לאתר כל עסקה ייחודית, ולזהות את ההקשר הרלוונטי של כל הודעת יומן.

4. NDC ב- Log4j

Log4j מספק מחלקה שנקראת NDC המספק שיטות סטטיות לניהול נתונים בערמת NDC. שימוש בסיסי:

  • כשנכנסים להקשר, השתמש NDC.push () כדי להוסיף נתוני הקשר בשרשור הנוכחי
  • כשאתה עוזב את ההקשר, השתמש NDC.pop () להוציא את נתוני ההקשר
  • ביציאה מהשרשור התקשר NDC. הסר () כדי להסיר הקשר אבחוני לשרשור ולהבטיח שחרור הזיכרון (החל מ- Log4j 1.3, כבר לא נחוץ)

ביישום לדוגמא, בואו נשתמש ב- NDC כדי להוסיף / להסיר נתונים קשריים במקומות רלוונטיים בקוד:

ייבא org.apache.log4j.NDC; @ RestController מחלקה ציבורית Log4JController {@Autowired @Qualifier ("Log4JInvestmentService") פרטי InvestmentService log4jBusinessService; @RequestMapping (value = "/ ndc / log4j", method = RequestMethod.POST) תגובה ציבורית ציבורי לאחר תשלום (השקעה השקעה ב- @ RequestBody) {NDC.push ("tx.id =" + investment.getTransactionId ()); NDC.push ("tx.owner =" + investment.getOwner ()); log4jBusinessService.transfer (investment.getAmount ()); NDC.pop (); NDC.pop (); NDC.remove (); להחזיר תגובה חדשה (השקעה, HttpStatus.OK); }}

ניתן להציג את התוכן של NDC בהודעות יומן באמצעות %איקס אפשרות ב ConversionPattern משמש על ידי appender ב log4j.properties:

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

בואו נפרוס את ה- REST API ל- tomcat. בקשה לדוגמא:

POST / logging-service / ndc / log4j {"transactionId": "4", "owner": "Marc", "amount": 2000}

אנו יכולים לראות את פרטי ההקשר האבחוני בפלט היומן:

48569 [http-nio-8080-exec-3] INFO Log4JInvestmentService - מתכונן להעברת 2000 $. - [tx.id = 4 tx.owner = Marc] 49231 [http-nio-8080-exec-4] INFO Log4JInvestmentService - מתכונן להעברת 1500 $. - [tx.id = 6 tx.owner = Samantha] 49334 [http-nio-8080-exec-3] INFO Log4JInvestmentService - האם העברה של 2000 $ הושלמה בהצלחה? נָכוֹן. - [tx.id = 4 tx.owner = Marc] 50023 [http-nio-8080-exec-4] INFO Log4JInvestmentService - האם ההעברה של 1500 $ הושלמה בהצלחה? נָכוֹן. - [tx.id = 6 tx.owner = סמנתה] ...

5. NDC ב- Log4j 2

NDC ב- Log4j 2 נקרא כמחסנית ההקשר של החוט:

ייבא org.apache.logging.log4j.ThreadContext; @RestController מחלקה ציבורית Log4J2Controller {@Autowired @Qualifier ("Log4J2InvestmentService") פרטי InvestmentService log4j2BusinessService; @RequestMapping (value = "/ ndc / log4j2", method = RequestMethod.POST) תגובה ציבורית ציבורית ResponseEntity (השקעה השקעה @RequestBody) {ThreadContext.push ("tx.id =" + investment.getTransactionId ()); ThreadContext.push ("tx.owner =" + investment.getOwner ()); log4j2BusinessService.transfer (investment.getAmount ()); ThreadContext.pop (); ThreadContext.pop (); ThreadContext.clearAll (); להחזיר ResponseEntity חדש (השקעה, HttpStatus.OK); }}

בדיוק כמו עם Log4j, בואו נשתמש ב- %איקס אפשרות בקובץ התצורה של Log4j 2 log4j2.xml:

פלט יומן:

204724 [http-nio-8080-exec-1] INFO Log4J2InvestmentService - מתכונן להעברת 1500 $. - [tx.id = 6, tx.owner = Samantha] 205455 [http-nio-8080-exec-2] INFO Log4J2InvestmentService - מתכונן להעברת 2000 $. - [tx.id = 4, tx.owner = Marc] 205525 [http-nio-8080-exec-1] INFO Log4J2InvestmentService - האם העברה של 1500 $ הושלמה בהצלחה? שֶׁקֶר. - [tx.id = 6, tx.owner = Samantha] 206064 [http-nio-8080-exec-2] INFO Log4J2InvestmentService - האם העברה של 2000 $ הושלמה בהצלחה? נָכוֹן. - [tx.id = 4, tx.owner = מארק] ...

6. NDC בחזיתות רישום (רישום JBoss)

חזיתות רישום כמו SLF4J מספקות אינטגרציה עם מסגרות רישום שונות. NDC אינו נתמך ב- SLF4J (אך כלול במודול slf4j-ext). רישום JBoss הוא גשר עצים, ממש כמו SLF4J. NDC נתמך ב- JBoss Logging.

כברירת מחדל, רישום JBoss יחפש ב- ClassLoader עבור הזמינות של ספקים אחוריים בסדר העדיפויות הבא: JBoss LogManager, Log4j 2, Log4j, SLF4J ו- JDK Logging.

JBoss LogManager כספק הרישום משמש בדרך כלל בתוך שרת היישומים WildFly. במקרה שלנו, גשר הרישום של JBoss יבחר בסדר העדיפות הבא (שהוא Log4j 2) כספק הרישום.

נתחיל בהוספת התלות הנדרשת ב- pom.xml:

 org.jboss.logging jboss-logging 3.3.0.Final 

ניתן לבדוק כאן את הגרסה האחרונה של התלות.

בואו נוסיף מידע קונטקטואלי למחסנית NDC:

יבוא org.jboss.logging.NDC; @RestController מחלקה ציבורית JBossLoggingController {@Autowired @Qualifier ("JBossLoggingInvestmentService") פרטי InvestmentService jbossLoggingBusinessService; @RequestMapping (value = "/ ndc / jboss-logging", method = RequestMethod.POST) תגובה ציבורית ציבורית ResponseEntity postPayment (השקעה השקעה ב- @ RequestBody) {NDC.push ("tx.id =" + investment.getTransactionId ()); NDC.push ("tx.owner =" + investment.getOwner ()); jbossLoggingBusinessService.transfer (investment.getAmount ()); NDC.pop (); NDC.pop (); NDC. ברור (); להחזיר ResponseEntity חדש (השקעה, HttpStatus.OK); }}

פלט יומן:

17045 [http-nio-8080-exec-1] מידע JBossLoggingInvestmentService - מתכונן להעברת 1,500 $. - [tx.id = 6, tx.owner = Samantha] 17725 [http-nio-8080-exec-1] INFO JBossLoggingInvestmentService - האם ההעברה של 1,500 $ הושלמה בהצלחה? נָכוֹן. - [tx.id = 6, tx.owner = Samantha] 18257 [http-nio-8080-exec-2] מידע JBossLoggingInvestmentService - מתכונן להעברת 2,000 $. - [tx.id = 4, tx.owner = Marc] 18904 [http-nio-8080-exec-2] INFO JBossLoggingInvestmentService - האם העברה של 2,000 $ הושלמה בהצלחה? נָכוֹן. - [tx.id = 4, tx.owner = מארק] ...

7. מסקנה

ראינו כיצד הקשר אבחוני עוזר לתאם יומנים בצורה משמעותית - מבחינה עסקית וגם למטרות ניפוי באגים. זוהי טכניקה שלא יסולא בפז להעשרת רישום עצים, במיוחד ביישומים מרובי-הברגה.

את הדוגמה המשמשת במאמר זה ניתן למצוא בפרויקט Github.


$config[zx-auto] not found$config[zx-overlay] not found