คำถามติดแท็ก mdc

8
จะใช้ MDC กับเธรดพูลได้อย่างไร
ในซอฟต์แวร์ของเราเราใช้ MDC อย่างกว้างขวางเพื่อติดตามสิ่งต่างๆเช่นรหัสเซสชันและชื่อผู้ใช้สำหรับคำขอเว็บ ทำงานได้ดีในขณะที่ทำงานในเธรดดั้งเดิม อย่างไรก็ตามมีหลายสิ่งหลายอย่างที่ต้องดำเนินการในพื้นหลัง เพื่อที่เราจะใช้java.concurrent.ThreadPoolExecutorและjava.util.Timerคลาสพร้อมกับบริการดำเนินการ async ที่ผ่านการม้วนตัวเอง บริการทั้งหมดเหล่านี้จัดการเธรดพูลของตนเอง นี่คือสิ่งที่คู่มือ Logbackได้พูดเกี่ยวกับการใช้ MDC ในสภาพแวดล้อมดังกล่าว: สำเนาของบริบทการวินิจฉัยที่แมปไม่สามารถสืบทอดโดยเธรดผู้ปฏิบัติงานจากเธรดเริ่มต้นได้เสมอไป นี่เป็นกรณีที่เมื่อใช้ java.util.concurrent.Executors สำหรับการจัดการเธรด ตัวอย่างเช่นเมธอด newCachedThreadPool สร้าง ThreadPoolExecutor และเช่นเดียวกับรหัสการรวมเธรดอื่น ๆ มันมีตรรกะการสร้างเธรดที่สลับซับซ้อน ในกรณีเช่นนี้ขอแนะนำให้เรียกใช้ MDC.getCopyOfContextMap () บนเธรด (ต้นแบบ) ต้นฉบับก่อนส่งงานไปยังผู้ปฏิบัติการ เมื่องานรันตามการดำเนินการครั้งแรกควรเรียกใช้ MDC.setContextMapValues ​​() เพื่อเชื่อมโยงสำเนาที่เก็บไว้ของค่า MDC ดั้งเดิมกับเธรดที่ได้รับการจัดการ Executor ใหม่ สิ่งนี้จะใช้ได้ แต่เป็นการง่ายมากที่จะลืมการเพิ่มสายเหล่านั้นและไม่มีวิธีที่ง่ายในการจดจำปัญหาจนกว่าจะสายเกินไป เครื่องหมายเดียวกับ Log4j คือคุณได้รับข้อมูล MDC ที่ขาดหายไปในบันทึกและด้วย Logback คุณจะได้รับข้อมูล MDC ที่เก่า (เนื่องจากเธรดในพูลของดอกยางนั้นได้รับ …
146 java  logging  slf4j  logback  mdc 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.