私は Play Framework を使用しており、Hibernate によって実行されるクエリを取得したいと考えています。
コンソールにクエリを表示するための設定がapplication.conf(jpa.debugSQL = true)にあることは知っていますが、コードからこれらのクエリを取得して、ユーザーのために自分で表示することです(各ページ要求のクエリを表示する Web サイトの管理インターフェイス)。
ご協力ありがとうございました !
私は Play Framework を使用しており、Hibernate によって実行されるクエリを取得したいと考えています。
コンソールにクエリを表示するための設定がapplication.conf(jpa.debugSQL = true)にあることは知っていますが、コードからこれらのクエリを取得して、ユーザーのために自分で表示することです(各ページ要求のクエリを表示する Web サイトの管理インターフェイス)。
ご協力ありがとうございました !
log4j (または他の同様のロギング フレームワーク) に精通していれば、非常に簡単に達成できるはずです。
すべてのイベントを受信するように構成されたカスタム アペンダーを作成できますorg.hibernate.SQL
(これは、SQL 出力を提供するパッケージです)。このアペンダーは、すべてのイベントをFIFO bufferに入れます。これにより、最後の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
}
}