6

我目前正在尝试在休眠中追踪一些延迟加载调用的来源,最简单的方法是在延迟加载发生时打开休眠 SQL 日志记录,然后理想情况下在任何时候触发堆栈跟踪输出使用记录器。现在我正在使用 Hibernate 3.5.2,它使用 SLF4j 并使用 Log4j 作为我的日志记录实现。

我想我可以使用 AOP 来包围每个日志记录调用并检查它是否是对 SQL 记录器的调用,但这似乎有点笨拙,我想知道在我走这条路之前是否有一种更简单的方法我错过了.

4

2 回答 2

5

您可以扩展其中一个 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>
于 2010-07-01T23:15:33.507 回答
0

您可以编写自己的 SLF4j 桥并将其放在类路径中,而不是 Log4j 中。然后,您可以委托给 Log4j,但在没有 AOP 的情况下截取您认为合适的调用。在确定正确的记录器以及何时发生延迟加载方面,它似乎更易于检测,并且在 AOP 之外没有任何额外的挑战。

于 2010-07-01T23:14:30.850 回答