MB)Log4Jに付属するJDBCAppenderはDBロギングのためのクラスですが、DBのコネクションプーリングに対応していません。本稿ではJDBCAppenderを拡張し、DBのコネクションプーリングに対応したカスタムのアペンダーを作成する方法を紹介します。ProjectのLog4Jは、DBにログを出力するためのクラスとしてJDBCAppenderクラスを用意しています。このクラスはコネクションプーリングに対応していないため、ログを出力するたびに「DBへの接続」「SQL実行」「DB接続のクローズ」を繰り返します。そのためログの出力回数が増えるとシステムの負荷が高くなってしまいます。本稿では、JDBCAppenderクラスを拡張してコネクションプーリングに対応させる例を紹介します。DBCP」を使用します。対象読者Javaでプログラミングしたことがある方を対象とします。3.1で動作確認をしています。1.7.3を使用します。HSQLDBは、Javaで記述されたDBです。使用方法が簡単でサンプルまたはデモ用のDBとしての使用に適しています。JBossのDBとしても組み込まれています。実装と設定(「log4j.properties」)Log4j基本設定Log4Jでは「ロガー(Logger)」と「アペンダー(Appender)」を設定ファイル(本稿では「log4j.properties」)に定義します。ロガーとはログ出力を実行するオブジェクトのことで、アプリケーションはこのロガーに対してログ出力を命令します。ロガーはログ出力命令を受けると、自らに関連付けられたアペンダーにログを出力します。アペンダーとはログ出力先のことです。Log4Jでは出力先ごとに、コンソール(ConsoleAppender)、ファイル(FileAppender、DailyxRollingFileAppender)、DB(JDBCAppender)、メール(SMTPAppender)、syslog(SyslogAppender)、NTイベントログ(NTEventLogAppender)、Telnet(TelnetAppender)、ソケット(SocketAppender)など、さまざまなアペンダーを用意しています。以下が本稿で使用する「log4j.properties」のロガーとアペンダーの定義です。「dataSourceLogger」という名前のロガーと、「appenderDB」という名前のアペンダーを使用します。logging.JDBCConnectionPoolAppender以下の表にLog4Jのログレベルを示します。どのログレベルを使用するかは、基本的に開発者に委ねられていますが、ここではそれぞれの一般的な使い方を簡単に説明します。ログレベルの高さは、数字が大きいほど高い事を示します。システムの本番環境では出力しない場合が多い。処理の開始・終了など正常に処理が行われていることを示すログ。実際の処理に影響を及ぼさないが、通常の状況とは違う状態である事を通知するログ。プロパティファイルの設定値がなくデフォルト値を適用する場合など。エラーが発生したが、リカバリ可能で処理を停止するほどでもない場合に出力されるログ。致命的で処理続行不能な場合に出力されるログ。以下の図に本稿のサンプルアプリケーションの全体図を示します。図中、オレンジ色のクラスが本稿で新規に作成するクラスです。JDBCConnectionPoolAppenderクラスはLog4Jで用意されているJDBCAppenderクラスをextentdsし作成します。アプリケーションはSampleAppクラスのmainメソッドから起動します。JDBCAppenderクラスプロパティLog4Jに用意されているorg.apache.log4j.JDBCAppenderクラスには、以下のプロパティが定義されています。ログ出力レベルの閾値。設定値より高いログレベルの場合のみ出力する。内部で持つログ出力のバッファ数。上記のプロパティを「log4j.properties」ファイルに以下のように設定します。この設定値はアペンダークラスのインスタンス変数に適用されます。'%m')log4j.appender.appenderDB.layout=org.apache.log4j.PatternLayoutlog4j.appender.appenderDB.Threshold=DEBUGlog4j.appender.appenderDB.bufferSize=1「log4j.appender.appenderDB.sql」のSQL文に指定されている「%d」、「%p」、「%m」はLog4Jではパターン文字といい、org.apache.log4j.PatternLayoutクラスによって、ログ出力時に、パターンごとに文字列変換されます。以下の表にPatternLayoutクラスによって変換できるパターン文字の主なものを示します。DBCP」のBasicDataSourceクラスを使用します。BasicDataSourceクラスはjavax.sql.DataSourceインターフェースをimplementsしています。BasicDataSourceクラスのプロパティBasicDataSourceクラスで、コネクションプーリングの設定に必要なプロパティは、以下の表の通りです。同時にプールから割り当てられる事ができるコネクションの最大数。無制限の場合0(ゼロ)を設定。プールに残すコネクションの最大数。無制限の場合0(ゼロ)を設定。プールに残す最小コネクション数。プールに残さない場合は、0(ゼロ)を設定。プール内初期コネクション数。使用可能なコネクションがプールから取得できない場合の、例外が投げられるまでの待機時間(ミリ秒)。これらのプロパティをDBCConnectionPoolAppenderクラスのインスタンス変数として実装します。以下が「log4j.properties」の設定です。以下の設定値がJDBCConnectionPoolAppenderクラスのインスタンス変数に適用されます。###log4j.appender.appenderDB.maxActive=10log4j.appender.appenderDB.maxIdle=2log4j.appender.appenderDB.minIdle=1log4j.appender.appenderDB.initialSize=5log4j.appender.appenderDB.maxWait=1000JDBCConnectionPoolAppenderクラスのインスタンス変数とセッターメソッドJDBCConnectionPoolAppenderクラスに、コネクションプーリング用のプロパティに対応したインスタンス変数とセッターメソッドを実装します。これにより、Log4JによってJDBCConnectionPoolAppenderのインスタンスにプロパティ値が適用されます。プールに残す最小コネクション数。プール内初期コネクション数。}コネクション・データソースの取得ConnectionはDataSource(=コネクションプール)から取得します。DBCPに用意されているBasicDataSourceクラスを使用しています。以下がコネクションのクローズ処理と、データソース(コネクションプール)のクローズ処理になります。コネクションクローズ処理はログの出力ごと、データソースクローズ処理は、インスタンスが消滅する際(finalize)に親クラスのJDBCAppenderから呼び出されます。}}サンプルアプリケーション今回作成したアペンダーを使用するサンプルアプリケーションです。メインメソッドでは、「dataSourceLogger」という名前のロガーを取得し、その「debug」「info」「warn」「error」「fatal」のメソッドを呼び出し、ログ出力を行っています。}}実行準備HSQLDB起動(サーバーモード)添付ファイルを展開したディレクトリ直下の「dbServer.bat」を起動すると、HSQLDBがサーバーモードで起動します。HSQLDBには複数の起動モードが用意されています。以下の表に、HSQLDBの起動モードについて簡単にまとめます。データを一切保存せず、メモリ上だけで動作。サーバとクライアントが一体となって動く。クライアントからアクセスする。HTTP経由でサーバにアクセスする。「dbServer.bat」の中身をみるとわかりますが、HSQLDBをサーバーモードで起動するには、HSQLDBのJarファイルにクラスパスを設定し、「org.hsqldb.Server」クラスを実行するだけです。9001以下の表に、HSQLDB起動時のオプションを簡単にまとめます。HSQLDBのファイルを保存するディレクトリとDBファイルプレフィックス名。「data/mydb」の場合、「data」ディレクトリ内に「mydb.log」、「mydb.properties」、「mydb.script」というファイルが作成されます。起動ポート番号データベースマネージャーの起動HSQLDBには、DBにアクセスするためのGUIのツールが用意されています。添付ファイルを展開したディレクトリ直下の「dbManager.bat」を起動すると、データベースマネージャーが起動します。データベースマネージャーの起動方法は、HSQLDBのJarファイルにクラスパスを設定し「oorg.hsqldb.util.DatabaseManager」クラスを実行するだけです。org.hsqldb.util.DatabaseManagerデータベースマネージャーが起動したらダイアログが開きますので、以下の表に示した値を入力し「OK」ボタンを押下して下さい。Script]を選択するとスクリプト選択のダイアログが開きますので「create_table.sql」を選択して下さい。Table文が表示されますので「Execute」ボタンを押下して下さい。データベースマネージャーの左側のツリーに「PROCESSLOG」テーブルが表示されます。添付ファイルを展開したディレクトリ直下の「exec.bat」を起動すると、サンプルが実行され、DBにログが出力されます。Script]を選択し、開いたダイアログで「select.sql」を選択して[Execute]ボタンを押下して下さい。DBに出力されたログが表示されます。まとめ本稿ではLog4Jの「JDBCAppender」を拡張してコネクションプーリングに対応させる方法を紹介しました。本稿はコネクションプーリングへの対応という例を紹介しましたが、本稿の例以外にも、Log4Jで用意されている様々なアペンダーを拡張し、カスタムのアペンダーを作成してみてはいかがでしょうか。