我为spring配置了事务支持。有没有什么方法可以记录事务以确保我正确地设置了一切?在日志中显示是查看正在发生的事情的好方法。
jobtbby31#
在你的log4j.properties中(对于替代的记录器,或者log4j的xml格式,请查看文档)根据您的事务管理器,您可以设置spring框架的日志记录级别,以便它为您提供更多关于事务的信息。
log4j.properties
log4j.logger.org.springframework.orm.jpa=INFO
(this是您的事务管理器的包),并且
log4j.logger.org.springframework.transaction=INFO
如果INFO不够,请使用DEBUG
INFO
DEBUG
lawou6xi2#
对我来说,要添加的一个好的日志记录配置是:拦截器=跟踪它会显示我的日志如下:2012-08-22 18:50:00,031跟踪-获取[com.MyClass.myMethod]的事务[my方法com.MyClass.myMethod中的自有日志语句]2012-08-22 18:50:00,142跟踪-完成[com.MyClass.myMethod]的事务
ego6inou3#
对于使用application.properties的Sping Boot 应用程序
application.properties
logging.level.ROOT=INFO logging.level.org.springframework.orm.jpa=DEBUG logging.level.org.springframework.transaction=DEBUG
或者如果你喜欢Yaml(application.yaml)
application.yaml
logging: level: org.springframework.orm.jpa: DEBUG org.springframework.transaction: DEBUG
qlvxas9a4#
您也可以启用JDBC日志记录:
log4j.logger.org.springframework.jdbc=DEBUG
3hvapo4f5#
大多数JtaTransactionManager.java的日志信息(如果这个问题仍然是关于JtaTransactionManager的)都是以DEBUG优先级记录的,假设你在类路径的某个地方有一个log4j.properties,我建议用途:
JtaTransactionManager.java
JtaTransactionManager
log4j.logger.org.springframework.transaction=DEBUG
daupos2t6#
因为可以在运行时访问Spring类,所以可以确定事务状态。
vfh0ocws7#
下面是我在Logback Layout实现中使用的一些代码,这些代码派生自ch.qos.logback.core.LayoutBase。我创建了一个线程局部变量来存储对org.springframework.transaction.support.TransactionSynchronizationManager.isActualTransactionActive()方法的引用,每当打印出一个新的日志行时,getSpringTransactionInfo()就会被调用,它返回一个单字符串,并将其放入日志中。参考文献:
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; }
7条答案
按热度按时间jobtbby31#
在你的
log4j.properties
中(对于替代的记录器,或者log4j的xml格式,请查看文档)根据您的事务管理器,您可以设置spring框架的日志记录级别,以便它为您提供更多关于事务的信息。
(this是您的事务管理器的包),并且
如果
INFO
不够,请使用DEBUG
lawou6xi2#
对我来说,要添加的一个好的日志记录配置是:
拦截器=跟踪
它会显示我的日志如下:
2012-08-22 18:50:00,031跟踪-获取[com.MyClass.myMethod]的事务
[my方法com.MyClass.myMethod中的自有日志语句]
2012-08-22 18:50:00,142跟踪-完成[com.MyClass.myMethod]的事务
ego6inou3#
对于使用
application.properties
的Sping Boot 应用程序或者如果你喜欢Yaml(
application.yaml
)qlvxas9a4#
您也可以启用JDBC日志记录:
3hvapo4f5#
大多数
JtaTransactionManager.java
的日志信息(如果这个问题仍然是关于JtaTransactionManager
的)都是以DEBUG
优先级记录的,假设你在类路径的某个地方有一个log4j.properties
,我建议用途:daupos2t6#
因为可以在运行时访问Spring类,所以可以确定事务状态。
vfh0ocws7#
下面是我在Logback Layout实现中使用的一些代码,这些代码派生自ch.qos.logback.core.LayoutBase。
我创建了一个线程局部变量来存储对
org.springframework.transaction.support.TransactionSynchronizationManager.isActualTransactionActive()
方法的引用,每当打印出一个新的日志行时,getSpringTransactionInfo()
就会被调用,它返回一个单字符串,并将其放入日志中。参考文献:
代码: