ฉันกำหนดค่าสปริงด้วยการรองรับธุรกรรม มีวิธีใดในการบันทึกธุรกรรมเพื่อให้แน่ใจว่าฉันตั้งค่าทุกอย่างถูกต้องหรือไม่? การแสดงในบันทึกเป็นวิธีที่ดีในการดูสิ่งที่เกิดขึ้น
ฉันกำหนดค่าสปริงด้วยการรองรับธุรกรรม มีวิธีใดในการบันทึกธุรกรรมเพื่อให้แน่ใจว่าฉันตั้งค่าทุกอย่างถูกต้องหรือไม่? การแสดงในบันทึกเป็นวิธีที่ดีในการดูสิ่งที่เกิดขึ้น
คำตอบ:
ในของคุณlog4j.properties
(สำหรับผู้ตัดไม้ทางเลือกหรือรูปแบบ xml ของ log4j ให้ตรวจสอบเอกสาร)
ขึ้นอยู่กับตัวจัดการธุรกรรมของคุณคุณสามารถตั้งค่าระดับการบันทึกของกรอบงานสปริงเพื่อให้ข้อมูลเพิ่มเติมเกี่ยวกับธุรกรรม ตัวอย่างเช่นในกรณีที่ใช้JpaTransactionManager
คุณตั้งค่า
log4j.logger.org.springframework.orm.jpa=INFO
(นี่คือแพ็คเกจของผู้จัดการธุรกรรมของคุณ) และ
log4j.logger.org.springframework.transaction=INFO
หากINFO
ไม่เพียงพอให้ใช้DEBUG
สำหรับฉันการกำหนดค่าการบันทึกที่ดีที่จะเพิ่มคือ:
log4j.logger.org.springframework.transaction.interceptor = trace
มันจะแสดงให้ฉันเห็นบันทึกเช่นนั้น:
2012-08-22 18: 50: 00,031 TRACE - การรับธุรกรรมสำหรับ [com.MyClass.myMethod]
[คำสั่งบันทึกของฉันเองจากวิธี com.MyClass.myMethod]
2012-08-22 18: 50: 00,142 TRACE - การทำธุรกรรมให้เสร็จสมบูรณ์สำหรับ [com.MyClass.myMethod]
สำหรับแอปพลิเคชัน Spring Boot ด้วยไฟล์ application.properties
logging.level.ROOT=INFO
logging.level.org.springframework.orm.jpa=DEBUG
logging.level.org.springframework.transaction=DEBUG
หรือถ้าคุณชอบ Yaml ( application.yaml
)
logging:
level:
org.springframework.orm.jpa: DEBUG
org.springframework.transaction: DEBUG
ข้อมูลบันทึกที่น่าสนใจที่สุดของJtaTransactionManager.java
(หากคำถามนี้ยังคงเกี่ยวกับJtaTransactionManager
) จะถูกบันทึกตามDEBUG
ลำดับความสำคัญ สมมติว่าคุณมีlog4j.properties
ที่ไหนสักแห่งบน classpath ฉันขอแนะนำให้ใช้:
log4j.logger.org.springframework.transaction=DEBUG
เนื่องจากคุณสามารถเข้าถึงคลาส Spring ที่รันไทม์คุณจึงสามารถกำหนดสถานะธุรกรรมได้ บทความนี้อาจช่วยคุณ:
isActualTransactionActive()
แทนการดึงข้อมูลในการเรียกบันทึกแต่ละครั้ง
คุณสามารถเปิดใช้งานการบันทึก JDBC ได้เช่นกัน:
log4j.logger.org.springframework.jdbc=DEBUG
นี่คือบางส่วนใช้ฉันรหัสในการดำเนิน Logback เค้าโครงของฉันมาจากch.qos.logback.core.LayoutBase
org.springframework.transaction.support.TransactionSynchronizationManager.isActualTransactionActive()
ฉันจะสร้างตัวแปรด้ายท้องถิ่นในการจัดเก็บการอ้างอิงถึงวิธีการ เมื่อใดก็ตามที่พิมพ์บรรทัดบันทึกใหม่จะgetSpringTransactionInfo()
ถูกเรียกและจะส่งคืนสตริงอักขระเดียวที่จะเข้าสู่บันทึก
อ้างอิง:
รหัส:
private static ThreadLocal<Method> txCheckMethod;
private static String getSpringTransactionInfo() {
if (txCheckMethod == null) {
txCheckMethod = new ThreadLocal<Method>() {
@Override public Method initialValue() {
try {
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
Class<?> tsmClass = contextClassLoader.loadClass("org.springframework.transaction.support.TransactionSynchronizationManager");
return tsmClass.getMethod("isActualTransactionActive", (Class<?>[])null);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
};
}
assert txCheckMethod != null;
Method m = txCheckMethod.get();
String res;
if (m == null) {
res = " "; // there is no Spring here
}
else {
Boolean isActive = null;
try {
isActive = (Boolean) m.invoke((Object)null);
if (isActive) {
res = "T"; // transaction active
}
else {
res = "~"; // transaction inactive
}
}
catch (Exception exe) {
// suppress
res = "?";
}
}
return res;
}
INFO
ระดับจะไม่แสดงกิจกรรม tx เลยมันจะดูละเอียดเกินไปDEBUG
จะมีความจำเป็นที่นั่น