Отображение транзакции Spring в журнале
Я настроил spring с транзакционной поддержкой. Есть ли способ регистрировать транзакции, чтобы убедиться, что я все правильно настроил? Отображение в журнале-это хороший способ увидеть, что происходит.
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 во время выполнения, вы можете определить статус транзакции. Эта статья может помочь вам:
вот некоторый код, который я использую в моей реализации макета Logback, полученной из ch.качество обслуживания.Logback так.ядро.LayoutBase.
Я создаю локальную переменную потока для хранения ссылки на метод
org.springframework.transaction.support.TransactionSynchronizationManager.isActualTransactionActive()
. Всякий раз, когда новая строка журнала распечатывается,getSpringTransactionInfo()
вызывается и возвращает односимвольную строку, которая пойдет в журнал.ссылки:
- советы по отладке Spring's @Transactional Аннотация
- org.springframework.торговая операция.поддержка.TransactionSynchronizationManager
- java.ленг.ThreadLocal
- java.ленг.Класс.getMethod()
код:
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; }