代码之家  ›  专栏  ›  技术社区  ›  Jherico

是否有一种方法可以在使用特定记录器时触发stacktrace?

  •  6
  • Jherico  · 技术社区  · 15 年前

    我目前正在尝试跟踪hibernate中一些延迟加载调用的来源,最简单的方法是在发生延迟加载时打开hibernatesql日志记录,然后在使用记录器时触发堆栈跟踪输出。现在我正在使用hibernate3.5.2,它使用SLF4j并使用Log4j作为日志实现。

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

    2 回复  |  直到 15 年前
        1
  •  5
  •   Sean Patrick Floyd    15 年前

    您可以扩展其中一个log4j附加器,然后在log4j.xml中使用它。

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

    <appender name="logger" class="StackPrintingFileAppender">
        ...
    </appender>
    
        2
  •  0
  •   Yishai    15 年前

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