जवाबों:
अपने में log4j.properties
(वैकल्पिक लकड़हारा, या log4j के xml प्रारूप के लिए, डॉक्स जांचें)
अपने लेनदेन प्रबंधक के आधार पर, आप स्प्रिंग फ्रेमवर्क के लॉगिंग स्तर को सेट कर सकते हैं ताकि यह आपको लेनदेन के बारे में अधिक जानकारी दे सके। उदाहरण के लिए, उपयोग करने के मामले में JpaTransactionManager
, आप सेट करते हैं
log4j.logger.org.springframework.orm.jpa=INFO
(यह आपके लेन-देन प्रबंधक का पैकेज है), और भी
log4j.logger.org.springframework.transaction=INFO
यदि INFO
पर्याप्त नहीं है, तो उपयोग करेंDEBUG
मेरे लिए, जोड़ने के लिए एक अच्छा लॉगिंग कॉन्फ़िगरेशन था:
log4j.logger.org.springframework.transaction.interceptor = ट्रेस
यह मुझे इस तरह लॉग इन दिखाएगा:
2012-08-22 18: 50: 00,031 TRACE - [com.MyClass.myMethod] के लिए लेनदेन हो रहा है
[विधि कॉम से मेरे अपने लॉग स्टेटमेंट। MyClass.myMethod]
2012-08-22 18: 50: 00,142 TRACE - [com.MyClass.myMethod] के लिए लेनदेन पूरा करना
के साथ स्प्रिंग बूट आवेदन के लिए application.properties
logging.level.ROOT=INFO
logging.level.org.springframework.orm.jpa=DEBUG
logging.level.org.springframework.transaction=DEBUG
या यदि आप यमल पसंद करते हैं ( application.yaml
)
logging:
level:
org.springframework.orm.jpa: DEBUG
org.springframework.transaction: DEBUG
JtaTransactionManager.java
(यदि यह सवाल अभी भी है JtaTransactionManager
) का सबसे दिलचस्प लॉग informations DEBUG
प्राथमिकता पर लॉग इन किया जाता है। मान लें कि आपके पास log4j.properties
क्लासपाथ पर कहीं है, तो मैं इस प्रकार उपयोग करने का सुझाव दूंगा:
log4j.logger.org.springframework.transaction=DEBUG
चूँकि आप रनटाइम पर स्प्रिंग क्लासेस एक्सेस कर सकते हैं, आप लेन-देन की स्थिति निर्धारित कर सकते हैं। यह लेख आपकी मदद कर सकता है:
isActualTransactionActive()
प्रत्येक लॉगिंग कॉल पर पुनर्प्राप्त करने के बजाय संदर्भ को कैश करने के लिए थ्रेड-लोकल वैरिएबल का उपयोग करना चाहिए ।
यहाँ कुछ कोड का उपयोग मैंने अपने लॉगबैक लेआउट कार्यान्वयन में किया है, जो 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
वहाँ आवश्यक होगा।