java 在日志中显示Spring事务

ssm49v7z  于 2023-01-19  发布在  Java
关注(0)|答案(7)|浏览(179)

我为spring配置了事务支持。有没有什么方法可以记录事务以确保我正确地设置了一切?在日志中显示是查看正在发生的事情的好方法。

jobtbby3

jobtbby31#

在你的log4j.properties中(对于替代的记录器,或者log4j的xml格式,请查看文档)
根据您的事务管理器,您可以设置spring框架的日志记录级别,以便它为您提供更多关于事务的信息。

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

(this是您的事务管理器的包),并且

log4j.logger.org.springframework.transaction=INFO

如果INFO不够,请使用DEBUG

lawou6xi

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]的事务

ego6inou

ego6inou3#

对于使用application.properties的Sping Boot 应用程序

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

或者如果你喜欢Yaml(application.yaml

logging:
   level:
      org.springframework.orm.jpa: DEBUG
      org.springframework.transaction: DEBUG
qlvxas9a

qlvxas9a4#

您也可以启用JDBC日志记录:

log4j.logger.org.springframework.jdbc=DEBUG
3hvapo4f

3hvapo4f5#

大多数JtaTransactionManager.java的日志信息(如果这个问题仍然是关于JtaTransactionManager的)都是以DEBUG优先级记录的,假设你在类路径的某个地方有一个log4j.properties,我建议用途:

log4j.logger.org.springframework.transaction=DEBUG
daupos2t

daupos2t6#

因为可以在运行时访问Spring类,所以可以确定事务状态。

vfh0ocws

vfh0ocws7#

下面是我在Logback Layout实现中使用的一些代码,这些代码派生自ch.qos.logback.core.LayoutBase
我创建了一个线程局部变量来存储对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;
}

相关问题