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

时间:2010-07-01 23:02:54

标签: java logging log4j stack-trace slf4j

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

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

2 个答案:

答案 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的任何额外挑战。