2009-12-27 7 views

Respuesta

69

en su log4j.properties (por madereros alternativos, o el formato XML de log4j, comprobar los documentos)

En función de su administrador de transacciones, puede establecer el nivel de registro de la marco de primavera para que te brinde más información sobre las transacciones. Por ejemplo, en el caso de utilizar JpaTransactionManager, se establece

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

(este es el paquete de la de su administrador de transacciones), y también

log4j.logger.org.springframework.transaction=INFO 

Si INFO no es suficiente, utiliza DEBUG

+4

El nivel 'INFO' no mostrará ninguna actividad tx en absoluto, sería demasiado detallado. 'DEBUG' será necesario allí. – skaffman

+2

No funciona para spring3.x – janwen

+0

@Bozho Tengo JpaTransactionManager y quiero monitorear cuándo se toma prestada una conexión del pool y cuándo se lanzó para una transacción específica. – Ali

6

Como puede acceder a las clases Spring en tiempo de ejecución, puede determinar el estado de la transacción. Este artículo puede ayudarle a:

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

+3

enlace roto .... – Gab

+0

Muy roto, pero intente: [Sugerencias para la depuración de la anotación @Transactional de Spring] (http://blog.timmattison.com/archives/2012/04/19/tips-for-debugging-springs -transactional-annotation /) (aún no lo he probado). Utiliza [TransactionSynchronizationManager] (https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/transaction/support/TransactionSynchronizationManager.html) para obtener el estado de la transacción. El código probablemente debería usar una variable local de subprocesos para almacenar en caché la referencia a 'isActualTransactionActive()' en lugar de recuperarla en cada llamada de registro. –

9

La información de registro más interesante de JtaTransactionManager.java (si esta pregunta todavía se trata del JtaTransactionManager) está registrada en DEBUG prioridad. Asumiendo que tiene un log4j.properties algún lugar en la ruta de clases, por lo tanto me gustaría sugerir a utilizar:

log4j.logger.org.springframework.transaction=DEBUG 
4

podría permitir el registro de JDBC, así:

log4j.logger.org.springframework.jdbc=DEBUG 
44

Para mí, un buen registro de configuración para agregar era :

log4j.logger.org.springframework.transaction.interceptor = traza

Mostrará me Log así:

2012-08-22 18: 50: 00.031 TRACE - Obtención de transacción para [com.MyClass.myMethod]

[mis propias declaraciones de registro de método COM .MyClass.myMethod]

2012-08-22 18: 50: 00 142 TRACE - Finalización de transacción para [com.MyClass.myMethod]

+0

¡Genial! No es necesario tener todo el registro de información/depuración/rastreo de otros paquetes, cuando esto es lo que está buscando: D – Johanneke

4

para la aplicación del resorte de arranque:

logging.level.ROOT=INFO 
logging.level.org.springframework.orm.jpa=DEBUG 
logging.level.org.springframework.transaction=DEBUG 
1

Aquí hay un código que uso en mi implementación de Logback Layout derivado de ch.qos.logback.core.LayoutBase.

Creo una variable de subproceso local para almacenar la referencia al método org.springframework.transaction.support.TransactionSynchronizationManager.isActualTransactionActive(). Cada vez que se imprime una nueva línea de registro, se llama al getSpringTransactionInfo() y devuelve una cadena de un carácter que irá al 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; 
} 
Cuestiones relacionadas