我目前正试图在hibernate中追踪一些延迟加载调用的来源,最简单的方法是在懒惰加载发生时打开hibernate SQL日志,然后理想地触发堆栈每当使用记录器时跟踪输出。现在我正在使用Hibernate 3.5.2,它使用SLF4j并使用Log4j作为我的日志记录实现。
我想我可以使用AOP来包围每个日志记录调用,并检查它是否是对SQL记录器的调用,但这看起来有点沉重,我想知道在我去之前是否有一个更简单的方法走那条路。
答案 0 :(得分:5)
您可以扩展其中一个log4j appender,然后在log4j.xml中使用它。
public class StackPrintingFileAppender extends FileAppender {
protected void subAppend(LoggingEvent event) {
new Exception().printStackTrace(new PrintWriter(qw));
super.subAppend();
}
}
然后在log4j.xml中:
<appender name="logger" class="StackPrintingFileAppender">
...
</appender>
答案 1 :(得分:0)
您可以编写自己的SLF4j桥,并将其放在类路径而不是Log4j桥中。然后,您可以委派给Log4j,但在没有AOP的情况下拦截您认为合适的呼叫。仪表似乎更简单,并且在确定正确的记录器和延迟加载时,不会遇到超出AOP的任何额外挑战。