2009-12-27 162 views
64

我配置了具有事務支持的春天。是否有任何方法可以記錄事務,以確保我正確設置所有內容?在日誌中顯示是查看正在發生的事情的好方法。在日誌中顯示春季交易

回答

69

log4j.properties(替代記錄儀,或Log4j的XML格式,檢查文檔)

根據您的事務管理器,你可以設置的日誌記錄級別春天的框架,以便它給你更多的交易信息。例如,在使用JpaTransactionManager的情況下,您可以設置

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

(這是您的事務管理器的封裝),也

log4j.logger.org.springframework.transaction=INFO 

如果INFO是不夠的,使用DEBUG

+4

'INFO'級別根本不會顯示任何tx活動,它會太冗長。那裏需要調試。 – skaffman 2009-12-27 11:03:58

+2

不適用於spring3.x – janwen 2012-06-11 05:42:32

+0

@Bozho我有JpaTransactionManager,我想監視連接何時從池中借用以及何時釋放特定事務。 – Ali 2013-06-04 18:31:50

6

因爲您可以在運行時訪問Spring類,所以您可以確定事務狀態。這篇文章可以幫助你:

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

+3

斷開的鏈接.... – Gab 2017-07-19 10:08:52

+0

非常壞,但請嘗試:[調試Spring的@Transactional註釋提示](http://blog.timmattison.com/archives/2012/04/19/tips-for-debugging-springs -transactional-annotation /)(還沒有嘗試過)。它使用[TransactionSynchronizationManager](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/transaction/support/TransactionSynchronizationManager.html)獲取交易狀態。代碼可能應該使用線程局部變量來緩存對「isActualTransactionActive()」的引用,而不是在每個日誌記錄調用中檢索它。 – 2017-10-07 16:17:02

9

最有趣的日誌信息JtaTransactionManager.java(如果這個問題仍然是關於JtaTransactionManager)記錄在DEBUG優先。假設你有classpath中的某處log4j.properties,我因此建議使用:

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

您可以啓用JDBC日誌記錄以及:

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

對我來說,一個好的日誌配置添加了:

log4j.logger.org.springframework.transaction.interceptor =痕量

它會告訴我日誌這樣的:

2012-08-22 18:50:00031 TRACE - 得到了[com.MyClass.myMethod]

[我自己的日誌從方法聲明事務COM .MyClass.myMethod]

2012-08-22 18:50:00142 TRACE - 完成交易,[com.MyClass.myMethod]

+0

太棒了!不需要其他軟件包的所有信息/調試/跟蹤日誌記錄,當這是你正在尋找的東西時:D – Johanneke 2015-02-18 13:23:10

4

對於彈簧啓動應用:

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

以下是我在Logback Layout實現中使用的一些代碼,派生自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; 
}