लॉग में एक स्प्रिंग लेनदेन दिखा रहा है


102

मैंने वसंत को ट्रांसेक्शनल समर्थन के साथ कॉन्फ़िगर किया। क्या यह सुनिश्चित करने के लिए कि मैं सब कुछ सही ढंग से सेट करने के लिए लेन-देन लॉग इन करने का कोई तरीका है? लॉग में दिखाना यह देखने का एक अच्छा तरीका है कि क्या हो रहा है।

जवाबों:


96

अपने में log4j.properties(वैकल्पिक लकड़हारा, या log4j के xml प्रारूप के लिए, डॉक्स जांचें)

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

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

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

log4j.logger.org.springframework.transaction=INFO

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


7
INFOस्तर किसी भी tx गतिविधि को बिल्कुल भी नहीं दिखाएगा, यह बहुत ही क्रियात्मक होगा। DEBUGवहाँ आवश्यक होगा।
स्केफमैन 11

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

तब आपको अपने कनेक्शन पूल के लिए लॉगिंग कॉन्फ़िगरेशन को बदलने की आवश्यकता होगी
Bozho

क्या होगा अगर हम mybatis + slf4j + logback + springboot का उपयोग करें?
लिली

66

मेरे लिए, जोड़ने के लिए एक अच्छा लॉगिंग कॉन्फ़िगरेशन था:

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] के लिए लेनदेन पूरा करना


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

31

के साथ स्प्रिंग बूट आवेदन के लिए 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

1
एक आकर्षण की तरह काम करता है
बेन

9

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

log4j.logger.org.springframework.transaction=DEBUG

7

चूँकि आप रनटाइम पर स्प्रिंग क्लासेस एक्सेस कर सकते हैं, आप लेन-देन की स्थिति निर्धारित कर सकते हैं। यह लेख आपकी मदद कर सकता है:

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


बहुत टूटा हुआ, लेकिन कोशिश करें: वसंत के @Transactional एनोटेशन डिबगिंग के लिए टिप्स (यह अभी तक खुद की कोशिश नहीं की है)। यह लेनदेन की स्थिति प्राप्त करने के लिए TransactionSynchronizationManager का उपयोग करता है । कोड को संभवतः isActualTransactionActive()प्रत्येक लॉगिंग कॉल पर पुनर्प्राप्त करने के बजाय संदर्भ को कैश करने के लिए थ्रेड-लोकल वैरिएबल का उपयोग करना चाहिए ।
डेविड टोनहोफर

6

आप JDBC लॉगिंग को सक्षम कर सकते हैं:

log4j.logger.org.springframework.jdbc=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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.