我正在使用 Play Framework,我想检索 Hibernate 执行的查询。
我知道 application.conf (jpa.debugSQL=true) 中有一个设置可以在控制台中显示查询,但我想做的是从代码中检索这些查询以自己为用户显示它们(比如网站中的管理界面查看每个页面请求的查询)。
感谢您的帮助 !
我正在使用 Play Framework,我想检索 Hibernate 执行的查询。
我知道 application.conf (jpa.debugSQL=true) 中有一个设置可以在控制台中显示查询,但我想做的是从代码中检索这些查询以自己为用户显示它们(比如网站中的管理界面查看每个页面请求的查询)。
感谢您的帮助 !
如果您熟悉 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
}
}