有没有办法在使用特定记录器时触发堆栈跟踪?

Jhe*_*ico 6 java logging log4j stack-trace slf4j

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

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

kro*_*ock 5

您可以扩展其中一个log4j appender,然后在log4j.xml中使用它.

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

然后在log4j.xml中:

<appender name="logger" class="StackPrintingFileAppender">
    ...
</appender>
Run Code Online (Sandbox Code Playgroud)