Respuestas:
en su log4j.properties
(para registradores alternativos o formato xml de log4j, consulte los documentos)
Dependiendo de su administrador de transacciones, puede establecer el nivel de registro del marco de Spring para que le brinde más información sobre las transacciones. Por ejemplo, en caso de usar JpaTransactionManager
, establece
log4j.logger.org.springframework.orm.jpa=INFO
(este es el paquete de su administrador de transacciones), y también
log4j.logger.org.springframework.transaction=INFO
Si INFO
no es suficiente, useDEBUG
Para mí, una buena configuración de registro para agregar fue:
log4j.logger.org.springframework.transaction.interceptor = rastreo
Me mostrará un registro así:
2012-08-22 18: 50: 00,031 TRACE - Obteniendo transacción para [com.MyClass.myMethod]
[mis propias declaraciones de registro del método com.MyClass.myMethod]
2012-08-22 18: 50: 00,142 TRACE - Completando transacción para [com.MyClass.myMethod]
Para la aplicación Spring Boot con application.properties
logging.level.ROOT=INFO
logging.level.org.springframework.orm.jpa=DEBUG
logging.level.org.springframework.transaction=DEBUG
o si prefieres Yaml ( application.yaml
)
logging:
level:
org.springframework.orm.jpa: DEBUG
org.springframework.transaction: DEBUG
La información de registro más interesante de JtaTransactionManager.java
(si esta pregunta todavía es sobre JtaTransactionManager
) se registra con DEBUG
prioridad. Suponiendo que tenga un log4j.properties
lugar en la ruta de clases, le sugiero que use:
log4j.logger.org.springframework.transaction=DEBUG
Debido a que puede acceder a las clases de Spring en tiempo de ejecución, puede determinar el estado de la transacción. Este artículo puede ayudarlo a:
isActualTransactionActive()
lugar de recuperarla en cada llamada de registro.
Aquí hay un código que utilizo en mi implementación de Logback Layout derivado de ch.qos.logback.core.LayoutBase .
Creo una variable local de hilo para almacenar la referencia al método org.springframework.transaction.support.TransactionSynchronizationManager.isActualTransactionActive()
. Siempre que se imprime una nueva línea de registro, getSpringTransactionInfo()
se llama y devuelve una cadena de un carácter que se incluirá en el registro.
Referencias:
Código:
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
level no mostrará ninguna actividad tx en absoluto, sería demasiado detallado.DEBUG
será necesario allí.