【问题标题】:Is there a way to trigger a stacktrace whenever a particular logger is used?有没有办法在使用特定记录器时触发堆栈跟踪?
【发布时间】:2010-07-01 23:02:54
【问题描述】:

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

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

【问题讨论】:

    标签: java logging log4j stack-trace slf4j


    【解决方案1】:

    您可以扩展其中一个 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>
    

    【讨论】:

    • 谢谢,这正是我想要的。它实际上并没有做我想要的(只打印我想要的类别的堆栈跟踪,但我可以轻松检查 LoggingEvent 以测试它是否是我想要打印堆栈跟踪的那个。
    • 缩小范围,以便附加程序仅对您想要查看的内容有效。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-04-06
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 2016-12-25
      • 1970-01-01
      • 2012-06-18
      • 2012-07-07
      相关资源
      最近更新 更多