Есть ли способ вызвать трассировку стека, когда используется определенный регистратор? - PullRequest
6 голосов
/ 02 июля 2010

В настоящее время я пытаюсь отследить источник некоторых отложенных вызовов загрузки в режиме гибернации, и самый простой способ сделать это - включить ведение журнала SQL в спящем режиме всякий раз, когда будет происходить отложенная загрузка, а затем в идеале вызвать стек вывод трассировки всякий раз, когда используется регистратор. Прямо сейчас я использую Hibernate 3.5.2, который использует SLF4j, и использую Log4j в качестве своей реализации журналирования.

Полагаю, я мог бы использовать AOP для окружения каждого вызова журналирования и проверки, является ли это вызовом регистратора SQL, но это кажется довольно сложным, и я хотел узнать, есть ли более простой подход, который я пропустил, прежде чем я ушел по этой дороге.

Ответы [ 2 ]

5 голосов
/ 02 июля 2010

Вы можете расширить один из приложений 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>
0 голосов
/ 02 июля 2010

Вы можете написать свой собственный мост SLF4j и поместить его в classpath вместо Log4j.Затем вы можете делегировать Log4j, но перехватывать вызовы, как считаете нужным, без AOP.Он кажется более простым в использовании и не испытывает никаких дополнительных сложностей, помимо AOP, с точки зрения определения правильного логгера и ленивой загрузки.

...