我目前正在尝试在休眠中追踪一些延迟加载调用的来源,最简单的方法是在延迟加载发生时打开休眠 SQL 日志记录,然后理想情况下在任何时候触发堆栈跟踪输出使用记录器。现在我正在使用 Hibernate 3.5.2,它使用 SLF4j 并使用 Log4j 作为我的日志记录实现。
我想我可以使用 AOP 来包围每个日志记录调用并检查它是否是对 SQL 记录器的调用,但这似乎有点笨拙,我想知道在我走这条路之前是否有一种更简单的方法我错过了.
我目前正在尝试在休眠中追踪一些延迟加载调用的来源,最简单的方法是在延迟加载发生时打开休眠 SQL 日志记录,然后理想情况下在任何时候触发堆栈跟踪输出使用记录器。现在我正在使用 Hibernate 3.5.2,它使用 SLF4j 并使用 Log4j 作为我的日志记录实现。
我想我可以使用 AOP 来包围每个日志记录调用并检查它是否是对 SQL 记录器的调用,但这似乎有点笨拙,我想知道在我走这条路之前是否有一种更简单的方法我错过了.
您可以扩展其中一个 log4j 附加程序,然后在 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>
您可以编写自己的 SLF4j 桥并将其放在类路径中,而不是 Log4j 中。然后,您可以委托给 Log4j,但在没有 AOP 的情况下截取您认为合适的调用。在确定正确的记录器以及何时发生延迟加载方面,它似乎更易于检测,并且在 AOP 之外没有任何额外的挑战。