Showing a Spring transaction in log

前端 未结 7 500
名媛妹妹
名媛妹妹 2020-11-30 19:10

I configured spring with transactional support. Is there any way to log transactions just to ensure I set up everything correctly? Showing in the log is a good way to see wh

7条回答
  •  醉酒成梦
    2020-11-30 19:32

    Here is some code I use in my Logback Layout implementation derived from ch.qos.logback.core.LayoutBase.

    I create a thread-local variable to store the reference to the method org.springframework.transaction.support.TransactionSynchronizationManager.isActualTransactionActive(). Whenever a new log line is printed out, getSpringTransactionInfo() is called and it returns a one-character string that will go into the log.

    References:

    • Tips for Debugging Spring's @Transactional Annotation
    • org.springframework.transaction.support.TransactionSynchronizationManager
    • java.lang.ThreadLocal
    • java.lang.Class.getMethod()

    Code:

    private static ThreadLocal txCheckMethod;
    
    private static String getSpringTransactionInfo() {
        if (txCheckMethod == null) {
            txCheckMethod = new ThreadLocal() {
                @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;
    }
    

提交回复
热议问题