2010-07-01 13 views
6

Actualmente estoy intentando rastrear el origen de algunas llamadas de carga diferidas en hibernación, y la forma más fácil de hacerlo sería activar el registro de hibernación de SQL siempre que se produzca la carga diferida y, luego, idealmente desencadenar un seguimiento de la pila salida cada vez que se utiliza el registrador. En este momento estoy usando Hibernate 3.5.2 que usa SLF4j y el uso de Log4j como mi implementación de registro.¿Hay alguna manera de desencadenar un stacktrace cada vez que se utiliza un registrador en particular?

Supongo que podría usar AOP para rodear cada llamada de registro y comprobar si se trata de una llamada al registrador de SQL, pero esto parece algo pesado y quería saber si había un enfoque más simple que me faltaba antes de que bajó por ese camino.

Respuesta

5

Puede extender uno de los apéndices de log4j y luego usarlo en su log4j.xml.

public class StackPrintingFileAppender extends FileAppender { 
    protected void subAppend(LoggingEvent event) { 
     new Exception().printStackTrace(new PrintWriter(qw)); 
     super.subAppend(); 
    } 
} 

y luego en log4j.xml:

<appender name="logger" class="StackPrintingFileAppender"> 
    ... 
</appender> 
+0

Gracias, eso es exactamente el tipo de cosas que quiero. en realidad no hace lo que quería (solo imprime trazos de pila para la categoría que quiero, pero puedo examinar fácilmente el LoggingEvent para probar si es el que quiero imprimir trazos de pila. – Jherico

+0

Acórtelo para que el appender sea solo activo para lo que quieres ver –

0

Puede escribir su propio puente SLF4j y ponerlo en el classpath en lugar del Log4j. Luego puede delegar en Log4j pero interceptar las llamadas como mejor le parezca, sin AOP. Parece más simple de instrumentar, y no sufre ningún desafío adicional por encima del AOP en términos de averiguar el registrador correcto y cuándo está ocurriendo la carga diferida.

Cuestiones relacionadas