0

我正在使用 Play Framework,我想检索 Hibernate 执行的查询。

我知道 application.conf (jpa.debugSQL=true) 中有一个设置可以在控制台中显示查询,但我想做的是从代码中检索这些查询以自己为用户显示它们(比如网站中的管理界面查看每个页面请求的查询)。

感谢您的帮助 !

4

1 回答 1

2

如果您熟悉 log4j(或任何其他类似的日志框架),它应该很容易实现。

您可以编写一个自定义附加程序,该附加程序将被配置为从org.hibernate.SQL(这是提供 SQL 输出的包)接收所有事件。该附加程序会将所有事件放入某个 FIFO 缓冲区中。这将允许您将最后n的日志条目保存在内存中。

其余的,我猜,就像在你的 webapp 中显示缓冲区内容一样简单。

编辑:事情可能是什么样子的例子:

log4j 配置:

<appender name="backend-appender" class="your.package.BackendAppender">
   <param name="bufferSize" value="200"/>
   <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="[%t]: %m - %c - %d %x%n"/>
   </layout>
</appender>

Java代码:

public class BackendAppender extends AppenderSkeleton {
   private Collection<LoggingEvent> buffer;
   private int bufferSize = 10;
   private Layout layout;

   @Override
   protected void append(LoggingEvent event) {
       buffer.add(event);
   }

   public void close() {
   }

   public boolean requiresLayout() {
      return false;
   }

   @Override
   public void activateOptions() {
       if (buffer == null) {
          buffer = new CircularFifoBuffer<>(bufferSize);
       }
       layout = getLayout();
   }

   public List<String> getHibernateLog() {
      List<String> list = new ArrayList<>();
      for (LoggingEvent event : buffer) {
          if (event == null) {
              continue;
          }
          list.add(layout.format(event));
          // check event.getThrowableInformation() -- it signals this was an exception rather than typical log line and you need to handle this differently

      }
   }
于 2012-12-08T22:27:48.807 回答