我为spring配置了事务支持。有没有办法记录事务只是为了确保我正确设置所有内容?在日志中显示是查看正在发生的事情的好方法。
答案 0 :(得分:81)
在您的log4j.properties
中(对于其他记录器或log4j的xml格式,请查看文档)
根据您的事务管理器,您可以设置spring框架的日志记录级别,以便它为您提供有关事务的更多信息。例如,如果使用JpaTransactionManager
,则设置
log4j.logger.org.springframework.orm.jpa=INFO
(这是您的交易经理的包裹),还有
log4j.logger.org.springframework.transaction=INFO
如果INFO
不够,请使用DEBUG
答案 1 :(得分:58)
对我来说,要添加的好日志配置是:
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]的交易
答案 2 :(得分:15)
对于Spring Boot应用程序:
logging.level.ROOT=INFO
logging.level.org.springframework.orm.jpa=DEBUG
logging.level.org.springframework.transaction=DEBUG
答案 3 :(得分:9)
JtaTransactionManager.java
的最有趣的日志信息(如果此问题仍然是JtaTransactionManager
)将以DEBUG
优先级记录。假设你在类路径的某个地方有log4j.properties
,我建议使用:
log4j.logger.org.springframework.transaction=DEBUG
答案 4 :(得分:6)
因为您可以在运行时访问Spring类,所以可以确定事务状态。本文可能对您有所帮助:
答案 5 :(得分:5)
您也可以启用JDBC日志记录:
log4j.logger.org.springframework.jdbc=DEBUG
答案 6 :(得分:1)
以下是我在ch.qos.logback.core.LayoutBase派生的Logback Layout实现中使用的一些代码。
我创建了一个线程局部变量来存储对方法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;
}