Показ весняної транзакції в журналі


102

Я налаштував весну з транзакційною підтримкою. Чи є спосіб реєстрації транзакцій просто для того, щоб я все правильно налаштував? Показ у журналі - хороший спосіб побачити, що відбувається.

Відповіді:


96

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

Залежно від вашого менеджера транзакцій, ви можете встановити рівень реєстрації весняної рамки, щоб він давав більше інформації про транзакції. Наприклад, у разі використання JpaTransactionManagerви встановлюєте

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

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

log4j.logger.org.springframework.transaction=INFO

Якщо INFOнедостатньо, використовуйтеDEBUG


7
INFOрівень взагалі не показуватиме будь-яку активність tx, це було б занадто багатослівно. DEBUGтам знадобиться.
skaffman

@Bozho Я JpaTransactionManager і хочу контролювати, коли з'єднання запозичене у пулу та коли воно було випущене для певної транзакції.
Алі

тоді вам потрібно буде змінити конфігурацію журналу для пулу підключень
Bozho

що робити, якщо ми використовуємо mybatis + slf4j + logback + springboot?
лілія

66

Для мене гарною конфігурацією реєстрації, яку потрібно додати, було:

log4j.logger.org.springframework.transaction.interceptor = слід

Він покаже мені журнал таким чином:

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]


1
Чудово! Не потрібно мати всю інформацію / налагодження / трасування журналів інших пакетів, коли це саме ви шукаєте: D
Johanneke

31

Для програми Spring Boot за допомогою application.properties

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

1
Працює як шарм
Бен

9

Найцікавіша інформація журналу JtaTransactionManager.java (якщо це питання все ще стосується JtaTransactionManager) входять у DEBUGпріоритет. Припускаючи, що у вас є log4j.propertiesдесь на уроці, я б запропонував використовувати:

log4j.logger.org.springframework.transaction=DEBUG

7

Оскільки ви можете отримати доступ до весняних класів під час виконання, ви можете визначити стан транзакції. Ця стаття може допомогти вам:

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


Дуже зламано, але спробуйте: Поради щодо налагодження @Transactional Анотація Spring (ще не пробував). Він використовує TransactionSynchronizationManager для отримання статусу транзакції. Код, ймовірно, повинен використовувати локальну змінну потоку для кешування посилання на isActualTransactionActive()замість того, щоб отримувати її в кожному дзвінку реєстрації.
Девід Тонхофер

6

Ви також можете ввімкнути журнал JDBC:

log4j.logger.org.springframework.jdbc=DEBUG

1

Ось який-небудь код, який я використовую в моїй реалізації версії Logback, отриманої від 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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.