在日志中显示Spring事务

时间:2009-12-27 07:44:54

标签: java spring transactional

我为spring配置了事务支持。有没有办法记录事务只是为了确保我正确设置所有内容?在日志中显示是查看正在发生的事情的好方法。

7 个答案:

答案 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类,所以可以确定事务状态。本文可能对您有所帮助:

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

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