DataNucleusのJDOの実装を使用してデータベースにアクセスする運用可能なJavaアプリケーションがあると仮定すると、データベースに対して行われたすべてのSQLクエリをインターセプトすることは可能ですか?それらの統計を実行し、ログ/トレースを保持することを目的としています。
2 に答える
カテゴリDataNucleus.Datastore.Nativeをオンにすることで、DataNucleusからすべてのSQLステートメントのログを簡単に取得できます(http://www.datanucleus.org/products/datanucleus/logging.htmlを参照) 。
JDO2 InstanceLifecycleListenersを使用すると、イベントをインターセプトできますが、SQLステートメントがそこで利用できるとは思いません...
また、SQLプロファイリングツールをアプリサーバーで探すこともできます。たとえば、GlassFishを使用すると、SQLTraceListener実装を接続プールにアタッチできます。http://docs.oracle.com/cd/E18930_01/html/821-2418/giyck.html#giyggを参照してください
Log4j
DataNucleusでjava.util.loggingまたはLog4jを使用できます。Log4jの構成について説明します。
log4j.properties
# Define the destination and format of our logging
log4j.rootCategory=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{1}:%M:%L - %m%n
# DataNucleus Categories
log4j.category.DataNucleus=ALL
最後の行は、すべてのDataNucleusログを表示するために、INFOまたはALLにレベルしきい値を割り当てています。DataNucleusは一連のカテゴリを使用し、すべてのメッセージをこれらのカテゴリに記録します。詳細については、こちらをご覧ください。あなたはおそらく必要です
log4j.category.DataNucleus.Query
-クエリに関連するすべてのメッセージlog4j.category.DataNucleus.Datastore
-すべての一般的なデータストアメッセージ
またはlog4j.category.DataNucleus.JDO
-JDOに一般的なすべてのメッセージ
log4j.category.DataNucleus
すべてのDataNucleusログカテゴリのルートです。
log4jをCLASSPATHに追加します。依存関係の管理にGradleを使用しているので、ビルドスクリプトは次のとおりです。
build.gradle
configurations {
all*.exclude group: "commons-logging", module: "commons-logging"
}
dependencies {
// Logging
compile 'org.slf4j:slf4j-api:1.7.+'
runtime 'org.slf4j:slf4j-jdk14:1.7.+'
runtime ('log4j:log4j:1.2.17') {
exclude group: "com.sun.jdmk", module: "jmxtools"
exclude group: "com.sun.jmx", module: "jmxri"
exclude group: "javax.mail", module: "mail"
exclude group: "javax.jms", module: "jms"
}
}
アプリケーションの起動時にLog4J構成ファイルを提供するには、JVMパラメーターを次のように設定します。
-Dlog4j.configuration=file:log4j.properties
これは、JavaEEアプリケーションサーバー内で実行している場合に実行できます。または、Spring WebMVCを使用している場合は、log4j.propertiesをWEB-INF内に配置し、次のリスナーをデプロイメント記述子に追加します。
web.xml
<!-- The definition of the Log4j Configuration -->
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>