我正在使用Play Framework,我想检索Hibernate执行的查询。
我知道application.conf中有一个设置(jpa.debugSQL = true)来在控制台中显示查询,但我想要做的是从代码中检索这些查询以便我自己为用户显示它们(就像网站上的管理界面一样,可以查看每个页面请求的查询)。
感谢您的帮助!
答案 0 :(得分:2)
如果您熟悉log4j(或任何其他类似的日志记录框架),这应该很容易实现。
您可以编写一个自定义appender,它将配置为从org.hibernate.SQL
接收所有事件(这是提供SQL输出的包)。这个appender会将所有事件都放入some FIFO buffer。这将允许您将最后n
个日志条目保留在内存中。
其他,我想,就像在webapp中显示缓冲区内容一样简单。
编辑:事情的样子:
log4j config:
<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
}
}