在日志中显示一个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类,所以可以确定事务状态。 本文可能会帮助您:
您也可以启用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; }