在日志中显示一个Spring事务

我用事务支持configuration了spring。 有什么办法可以logging事务,以确保我正确设置了一切? 在日志中显示是查看正在发生的事情的好方法。

在你的log4j.properties (用于替代logging器,或log4j的xml格式,检查文档)

根据您的事务pipe理器,您可以设置Spring框架的日志logging级别,以便为您提供有关事务的更多信息。 例如,在使用JpaTransactionManager情况下,你设置

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

(这是你的事务pipe理器的包),还有

 log4j.logger.org.springframework.transaction=INFO 

如果INFO不够用,请使用DEBUG

对我来说,一个好的日志configuration添加是:

log4j.logger.org.springframework.transaction.interceptor = trace

它会显示我这样的日志:

2012-08-22 18:50:00,031 TRACE – 获取[com.MyClass.myMethod]

[我自己的日志语句来自方法com.MyClass.myMethod]

2012-08-22 18:50:00,142 TRACE – 为[com.MyClass.myMethod]完成事务

JtaTransactionManager.java最有趣的日志信息(如果这个问题仍然是关于JtaTransactionManager )以DEBUG优先级logging。 假设你在类path的某处有一个log4j.properties ,我build议使用:

 log4j.logger.org.springframework.transaction=DEBUG 

因为您可以在运行时访问Spring类,所以可以确定事务状态。 本文可能会帮助您:

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

您也可以启用JDBC日志logging:

 log4j.logger.org.springframework.jdbc=DEBUG 

对于Spring Boot应用程序:

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

这里是我在从ch.qos.logback.core.LayoutBase派生的Logback Layout实现中使用的一些代码。

我创build一个线程局部variables来存储对方法org.springframework.transaction.support.TransactionSynchronizationManager.isActualTransactionActive()的引用。 无论何时打印出新的日志行, getSpringTransactionInfo()被调用,并返回一个将会进入日志的单字符string。

参考文献:

  • debuggingSpring的@Transactional注解的技巧
  • org.springframework.transaction.support.TransactionSynchronizationManager
  • java.lang.ThreadLocal中
  • java.lang.Class.getMethod()

码:

 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; }