ステップ

CodeIgniter アクセス(操作)ログの出力

CodeIgniter アクセス(操作)ログの出力

前説

前回のCodeIgniter エラーログの出力CodeIgniter SQLログの出力は、評判が良かったので、続いて、CodeIgniter アクセス(操作)ログの出力についても紹介したいと思います。
上記のCodeIgniter エラーログの出力CodeIgniter SQLログの出力は、CodeIgniterフレームワークを改造して、ログを出力するようにしましたが、今回は、CodeIgniterのフック(hook)機能を使って、アクセス(操作)ログの出力を実現します。
CodeIgniterのフック(hook)機能と言えば、Java世界において、StrutsのfilterやSpringのadviceと同じように、一種のAOPに過ぎないです。設定作業や実装はJavaよりかなり簡単で、開発効率が非常に高いです。

前提

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

要件

・誰がいつ、どの画面、何を入力、どの操作をしたことを、アクセス(操作)ログに記録し、日単位で管理すること。→ログローテーションのこと
ここの
誰⇒ユーザーID
いつ⇒操作時のシステムタイム
どの画面⇒URL
何を入力⇒URLのパラメータ情報、POST情報
どの操作⇒URLとPOST情報
を出力すれば、運用時に、障害調査や操作履歴調査する際に、非常に助かります。大きなプロジェクトだけではなく、小さなECサイトでも、是非アクセス(操作)ログの出力を意識して、実装してみてください。

考え方

ユーザーがURLを叩いたり、画面のボタンを押下したりした時に、サーバー側のコントローラーを呼び出すタイミングで、URLとPOSTなどの情報を取得して、アクセス(操作)ログに出力すれば良いかと思います。
そのため、前説に紹介したCodeIgniterのフック(hook)機能を使って、コントローラーを呼び出すタイミングで、フックを掛けて、アクセス(操作)ログに出力します。
簡単にまとめて、説明しますと、ポイントが2つ、

1.アクセス(操作)ログを出力するクラスを実装する。
2.No.1のクラス情報をフック情報としてを設定する。

以上です。

が、順序が逆ですが、アクセス(操作)ログの出力方法を紹介する前に、まず、CodeIgniterのフック設定作業を説明します。

1.CodeIgniterのフック機能を有効にする

application/config直下のconfig.phpファイルを開いて、「enable_hooks」をTRUEに設定しますと、CodeIgniterのフック機能が使えるようになります。

2.事前に用意したフッククラスを設定する。

上記と同じく、application/config直下のhooks.phpファイルを開いて、事前に用意したフッククラス情報を設定します。(フッククラスの中身は次に説明します。)

ここまでは、フック設定作業が完了しました。頭が痛いほどのJava設定作業より、簡単、簡単~~♪♪

3.アクセス(操作)ログの出力を実装

設定作業が完了したら、上記のフッククラスの実装を説明します。

フッククラスを作成

Javaと違って、フッククラスの継承は一切ない、クラス名を定義すれば、終わりです。簡単、簡単~~♪♪
application/hooksフォルダの下に、「FrontFilter.php」を新規に作成し、中身は下記の通りです。

メソッドを作成

続いて、上記の定義に、「access_log」というメソッドを実装します。このメソッドで、URLとPOSTなどの情報を取得して、アクセス(操作)ログに出力します。

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

サンプル

実装はここまで、実際にアクセス(操作)ログの出力サンプルをあげます。

まとめ

いかがでしょうか。CodeIgniter アクセス(操作)ログの出力は簡単ですよね。ほかの方法もあるかと思います。皆さんもいろいろな方法で試してみてください。
それでは、以上です。

追記

CodeIgniterフレームワークのフック機能を利用して、アクセス(操作)ログの出力方法を紹介しましたが、この方法は欠点があることを後日の本番エラーの調査時に気づきました。
それは、ログアウトの状態で、URLを直接叩いたり、お気に入りから遷移した際に、そのアクションがアクセス(操作)ログに記録されなかったことです。
その原因はアクセス(操作)ログの出力タイミングです。ログアウトの状態で、URLを直接叩いた場合、コントローラがインスタンス化する最中に存在するセッション生死チェック機能に引かれて、ログイン画面へ強制的に遷移させるため、今回アクセス(操作)ログの出力するのに、使っていたCodeIgniterのフックポイント:post_controller_constructorがコントローラがインスタンス化された直後に、呼び出されるため、当然ながら、アクセス(操作)ログを出力するわけがないですね。
対策として、コントローラが呼び出される直前に呼び出される、フックポイント:pre_controllerを使えば、良いのです。
しっかり検証せずに、軽くアクセス(操作)ログの出力方法を紹介した僕が悪かった、すみませんでした。