ステップ

CodeIgniter SQLログの出力

CodeIgniter SQLログの出力

前説

前回のCodeIgniter エラーログの出力は、評判が良かったので、続いて、CodeIgniter SQLログの出力についても紹介したいと思います。
CodeIgniter3.xにおいて、last_queryメソッドを使えば、直前に実行されたSQL文を返しますが、数十画面以上のWEBシステム開発において、各SQLを実行した直後に、いちいちlast_queryメソッドを呼んでログにはきだすのは非常にコストが掛かりまし、漏れる可能性も高いと思います。
なので、今回は、CodeIgniterフレームワークを改造し、各画面(機能)は、SQLログの出力を意識せず(コーディングは不要)、フレームワーク側で対応してくれるという方法を紹介します。

■CodeIgniterのlast_queryメソッドを利用してログに出力するサンプル

前提

・CodeIgniterバージョン:3.1.3
※バージョン:3.1.6でも使えますので、3.X系はいけそうではないかと思います。す。

要件

お客様からの要件は下記の通りです。
・システム運用時に、実行したSQL文、実行時間(ミリ秒まで)、消費時間(ミリ秒まで)をログに記録し、日単位で管理すること。→ログローテーションのこと

考え方

最初は、last_queryメソッド(場所:system\database\DB_driver.php)を改造すれば済むと思いましたが、フレームワークの実装を読んでたら、ムリと思って、このメソッドの使う$this->queries変数値の設定場所を探したら、ヒントがありました。
それは、同じクラス(DB_driver.php)のqueryメソッドです。queryメソッドは実際にSQL文を実行する場所なので、当然の話で、実行するSQL文は必ずこのメソッドにあるというわけです。

実装(queryメソッド)

queryメソッドをよく読んだら、SQL実行失敗と成功、2ケースがあり、当然ながら、ログに出力する際に、この2ケースを全部出力しなければならないですね。

まずは、SQL実行失敗時の実装です。場所は、DB_driver.phpの670行目あたりで(queryメソッド内)、下記のように、sql文と消費時間をこれから紹介するsql_logメソッドに渡します。

簡単なので、説明を割愛し、SQL実行成功時の実装に進めます。場所は、DB_driver.phpの706行目あたりで(queryメソッド内)、失敗時と同じように、sql文と消費時間をsql_logメソッドに渡します。

実装(sql_logメソッド)

sql_logメソッドの実装方法は簡単です。詳しくは、PHP ログ出力機能 実装方法 で紹介しましたので、ご参考まで。

サンプル

実装jはここまで、実際に出力したSQLログのサンプルをあげます。

まとめ

いかがでしょうか。意外と簡単にできましたね。CodeIgniter エラーログの出力方法も紹介しましたので、是非一度読んでください。
それでは、以上です。