SQLログ

  • 概要
RDBMSを使用したシステムの障害解析では、アプリケーションが発行したSQLの情報が重要です。本ソリューションは、Javaアプリケーションが発行した全てのSQLをログに出力します。
※本ソリューションは、Javaで作成されたアプリケーションにのみ導入可能です。.NETなどのJava以外のアプリケーションでは導入できません。

【ログのイメージ】
2012/01/25 10:36:33 [main] insert into t_user values('USER001','東京太郎','東京都三鷹市') {executed in 2 msec}
※ ログのフォーマットは、ご希望に沿ってカスタマイズできます
  • 特徴
    • パラメータの値を出力
通常、JavaのアプリケーションでSQLをログ出力する場合、パラメータの値はプレースホルダのマークで出力されてしまいます。
【通常】
insert into test_table values (?,?,?,?,?,?,?,?,?,?,?,?,?,?)
また、データベース製品が持つ機能でSQLの発行履歴を参照しても、パラメータの値が特定できるとは限りません。

本ソリューションでは、プレースホルダのマークをパラメータの値に置き換えてログに出力します。
【本ソリューション】
insert into test_table values (381,1,1,10000,10000,100.222,100.222,100.222,1,'abcde','かきくけこ','09/15/2012 09:48:05.775','09/15/2012 09:48:05.775','09/15/2012 09:48:05.775')

    • プログラムとの紐づけが容易
データベース製品が持つ機能でSQLの発行履歴を参照した場合、SQLを発行したプログラム(クラス・メソッド・スレッド)との紐づけが困難です。本ソリューションでは、SQLと合わせてスレッド名をログに出力するため、プログラムとの紐づけが容易になります。さらに、メソッドログと組み合わせれば、SQLとメソッドを簡単に紐づけることができます。
【SQLログとメソッドログを組み合わせたログのイメージ】
2012/01/25 10:36:33 [main] com.genba.UserService.registerUser(arg1:USER001, arg2:東京太郎, arg3:東京都三鷹市)
2012/01/25 10:36:33 [main] insert into t_user values('USER001','東京太郎','東京都三鷹市')  {executed in 2 msec}
2012/01/25 10:36:33 [main] com.genba.UserService.registerUser - end normally in 279msec

    • データベース製品やフレームワークに依存しない
プログラム上でSQLをログに出力するため、どのデータベース製品でも導入できます。また、HibernateやMyBatisなどのフレームワークを使っていても問題なく導入できます。

    • 既存のプログラムに影響が無い
既存のプログラムに手を入れず、設定ファイルの変更だけで、本ソューションを導入することができます。
# JDBCドライバの設定情報がハードコーディングされた場合はプログラムの変更が必要となります
また、パフォーマンスに優れており、処理時間への影響はほとんどありません。

    • SQLの実行時間を出力
SQLの実行に要した時間を出力するため、ボトルネックの調査にも役立ちます。

  • 用途
    • システムの障害解析
    • ボトルネック調査
  • 仕組み
JDBCドライバをラップしたプログラムを使用します。JDBCドライバをラップしたプログラムが、SQLをログに出力します。


ラップしたプログラムは、認知度の高いオープンソースのlog4jdbcをベースにして作成しているため、信頼性があります。

  • その他
導入の際は入念なテストを実施し、既存システムに影響が無いよう責任を持って導入致します。