Відповіді:
у своєму 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 = слід
Він покаже мені журнал таким чином:
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]
Для програми 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
Найцікавіша інформація журналу JtaTransactionManager.java
(якщо це питання все ще стосується JtaTransactionManager
) входять у DEBUG
пріоритет. Припускаючи, що у вас є log4j.properties
десь на уроці, я б запропонував використовувати:
log4j.logger.org.springframework.transaction=DEBUG
Оскільки ви можете отримати доступ до весняних класів під час виконання, ви можете визначити стан транзакції. Ця стаття може допомогти вам:
isActualTransactionActive()
замість того, щоб отримувати її в кожному дзвінку реєстрації.
Ось який-небудь код, який я використовую в моїй реалізації версії 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;
}
INFO
рівень взагалі не показуватиме будь-яку активність tx, це було б занадто багатослівно.DEBUG
там знадобиться.