Отображение транзакции Spring в журнале
Я настроил весну с поддержкой транзакций. Есть ли способ регистрировать транзакции только для того, чтобы правильно настроить все? Отображение в журнале – хороший способ увидеть, что происходит.
- Весна и hibernate: сеанс не найден для текущей темы
- Спящий режим, настраивающий несколько источников данных и несколько сессионных заводов
- Как тестировать блок памяти Spring-Jersey
- Spring Boot - Как получить текущий порт
- Как я могу удалить одноэлементную фасоль из ApplicationContext?
- Как отправить весенний токен csrf из клиента Postman rest?
- Spring Boot - Как регистрировать все запросы и ответы с исключениями в одном месте?
- Как добавить привязку к событию инициализации контекста приложения?
в log4j.properties
(для альтернативных журналов или в формате XML log4j, проверьте документы)
В зависимости от вашего менеджера транзакций вы можете установить уровень ведения журнала весеннего фреймворка, чтобы он дал вам больше информации о транзакциях. Например, в случае использования JpaTransactionManager
вы устанавливаете
log4j.logger.org.springframework.orm.jpa=INFO
(это пакет вашего менеджера транзакций), а также
log4j.logger.org.springframework.transaction=INFO
Если INFO
недостаточно, используйте DEBUG
Для меня хорошая конфигурация регистрации:
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]
Наиболее интересные данные журнала JtaTransactionManager.java
(если этот вопрос по-прежнему относится к JtaTransactionManager
) регистрируются по приоритету DEBUG
. Предполагая, что у вас есть log4j.properties
где-то на пути к classам, я бы поэтому предложил использовать:
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
Поскольку вы можете получить доступ к classам Spring во время выполнения, вы можете определить статус транзакции. Эта статья может помочь вам:
Вы также можете включить журналирование JDBC:
log4j.logger.org.springframework.jdbc=DEBUG
Вот некоторый код, который я использую в моей реализации Layout Layout, полученный из ch.qos.logback.core.LayoutBase .
Я создаю локальную переменную streamа, чтобы сохранить ссылку на метод org.springframework.transaction.support.TransactionSynchronizationManager.isActualTransactionActive()
. Всякий раз, когда печатается новая строка журнала, getSpringTransactionInfo()
и возвращает односимвольную строку, которая войдет в журнал.
Рекомендации:
- Советы по отладке @Transactional Spring’s Annotation
- org.springframework.transaction.support.TransactionSynchronizationManager
- java.lang.ThreadLocal
- java.lang.Class.getMethod ()
Код:
private static ThreadLocal txCheckMethod; private static String getSpringTransactionInfo() { if (txCheckMethod == null) { txCheckMethod = new ThreadLocal () { @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; }