2009-12-27 15 views
64

में वसंत लेनदेन दिखा रहा है मैंने लेनदेन संबंधी समर्थन के साथ वसंत कॉन्फ़िगर किया। क्या यह सुनिश्चित करने के लिए लेनदेन लॉग करने का कोई तरीका है कि मैं सबकुछ ठीक से स्थापित करूँ? लॉग में दिखाना यह देखने का एक अच्छा तरीका है कि क्या हो रहा है।लॉग

उत्तर

69

(वैकल्पिक वालों के लिए, या log4j के एक्सएमएल प्रारूप, डॉक्स की जाँच करें)

अपने लेन-देन प्रबंधक के आधार पर आप की लॉगिंग स्तर सेट कर सकते हैं वसंत ढांचे ताकि यह आपको लेनदेन के बारे में अधिक जानकारी देता है। उदाहरण के लिए, JpaTransactionManager का उपयोग कर के मामले में, आप

log4j.logger.org.springframework.orm.jpa=INFO 

(यह आपका लेनदेन प्रबंधक के पैकेज है), और भी

log4j.logger.org.springframework.transaction=INFO 

सेट करते हैं INFO पर्याप्त नहीं है, का उपयोग DEBUG

+4

'INFO' स्तर किसी भी टीएक्स गतिविधि को बिल्कुल नहीं दिखाएगा, यह भी वर्बोज़ होगा। वहां 'डेबग' आवश्यक होगा। – skaffman

+2

spring3.x – janwen

+0

@ बोझो मेरे पास JpaTransactionManager के लिए काम नहीं है और मैं निगरानी करना चाहता हूं कि पूल से कनेक्शन उधार लिया जाता है और जब इसे किसी विशिष्ट लेनदेन के लिए रिहा किया जाता है। – Ali

6

क्योंकि आप रनटाइम पर स्प्रिंग क्लासेस तक पहुंच सकते हैं, तो आप लेनदेन की स्थिति निर्धारित कर सकते हैं। यह लेख आपको मदद मिल सकती है: अपने log4j.properties में

https://dzone.com/articles/monitoring-declarative-transac

+3

टूटी हुई लिंक .... – Gab

+0

बहुत टूटा हुआ है, लेकिन कोशिश करें: [स्प्रिंग के @ ट्रान्सैक्शनल एनोटेशन को डिबग करने के लिए टिप्स] (http://blog.timmattison.com/archives/2012/04/19/tips-for-debugging-springs -ट्रांसेक्शन-एनोटेशन /) (अभी तक इसे स्वयं नहीं किया है)। लेनदेन की स्थिति प्राप्त करने के लिए यह [लेनदेन सिंक्रनाइज़ेशन प्रबंधक] (https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/transaction/support/TransactionSynchronizationManager.html) का उपयोग करता है। कोड को प्रत्येक लॉगिंग कॉल पर पुनर्प्राप्त करने के बजाय 'isActualTransactionActive()' के संदर्भ को कैश करने के लिए शायद थ्रेड-लोकल वैरिएबल का उपयोग करना चाहिए। –

9

JtaTransactionManager.java की सबसे रोचक लॉग सूचनाएं (यदि यह प्रश्न अभी भी JtaTransactionManager के बारे में है) DEBUG प्राथमिकता पर लॉग इन हैं। मान लें कि आप classpath पर एक log4j.properties कहीं है, मैं इस प्रकार का उपयोग करने के लिए सुझाव चाहते हैं:

log4j.logger.org.springframework.transaction=DEBUG 
4

साथ ही आप प्रवेश करने JDBC सक्षम हो सकते हैं:

log4j.logger.org.springframework.jdbc=DEBUG 
44

मेरे लिए, जोड़ने के लिए था एक अच्छा प्रवेश config :

log4j.logger.org.springframework.transaction.interceptor = ट्रेस

यह मुझे उस तरह लोग इन दिखाएगा:

2012-08-22 18: 50: 00,031 ट्रेस - [com.MyClass.myMethod]

[मेरे अपने लॉग विधि से बयान के लिए लेन-देन हो रही कॉम .MyClass.myMethod]

2012-08-22 18: 50: 00,142 ट्रेस - लेन-देन को पूरा करने [com.MyClass.myMethod]

+0

ग्रेट के लिए लॉगिंग कॉन्फ़िगरेशन बदलने की आवश्यकता होगी! अन्य पैकेजों की सभी जानकारी/डीबग/ट्रेस लॉगिंग करने की आवश्यकता नहीं है, जब आप यही खोज रहे हैं: डी – Johanneke

4

स्प्रिंग बूट आवेदन के लिए के लिए:

logging.level.ROOT=INFO 
logging.level.org.springframework.orm.jpa=DEBUG 
logging.level.org.springframework.transaction=DEBUG 
1

यहां कुछ कोड है जो मैं 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; 
}