Отображение транзакции Spring в журнале


Я настроил spring с транзакционной поддержкой. Есть ли способ регистрировать транзакции, чтобы убедиться, что я все правильно настроил? Отображение в журнале-это хороший способ увидеть, что происходит.

7 72

7 ответов:

в своем log4j.properties (для альтернативных регистраторов или xml-формата log4j проверьте документы)

в зависимости от вашего менеджера транзакций вы можете установить уровень ведения журнала spring framework, чтобы он давал вам больше информации о транзакциях. Например, в случае использования JpaTransactionManager, ты

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

(пакет вашего менеджера транзакций), а также

log4j.logger.org.springframework.transaction=INFO

если INFO не достаточно, используйте DEBUG

для меня хорошая конфигурация регистрации для добавления была:

настройки log4j.логгер.орг.springframework.сделки.перехватчик = след

Он покажет мне журнал вот так:

2012-08-22 18: 50: 00,031 трассировка - получение транзакции для [com.Класса MyClass.myMethod]

[мои собственные операторы журнала из метода com.Класса MyClass.myMethod]

2012-08-22 18:50:00,142 след - завершение сделки по [com.Класса MyClass.myMethod]

самые интересные данные журнала JtaTransactionManager.java (если этот вопрос все-таки о JtaTransactionManager) регистрируются на DEBUG приоритет. Если у вас есть log4j.properties где-то на пути к классам, я бы таким образом предложил использовать:

log4j.logger.org.springframework.transaction=DEBUG

для приложения Spring Boot:

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

поскольку вы можете получить доступ к классам Spring во время выполнения, вы можете определить статус транзакции. Эта статья может помочь вам:

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

вы также можете включить ведение журнала JDBC:

log4j.logger.org.springframework.jdbc=DEBUG

вот некоторый код, который я использую в моей реализации макета Logback, полученной из ch.качество обслуживания.Logback так.ядро.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;
}