【PHP】Apacheのaccess_logにユーザIDを追加する
最近プログラムから離れてるけど大丈夫かなぁ。
ってことで今日もサーバいじいじしています。
いや、暇なんじゃないんです。
今日はApacheのログについてです。
モバイルゲームだったりだとか会員制サイトだったり、 ユーザIDが存在するサービスではKPI用にログが必要だったりしますよね。
どのユーザがいつ、どこのURLにアクセスしたのか。
そういうのをアクセスログから取ったりしてユーザの動向を探ったり、してサービス改善をするものです。
さて今回依頼されたのはまさにそれ。 どのユーザがどこのページにいつアクセスしたのか取りたいんだけどなんとかならない?
という内容でした。
もちろんユーザIDだけでなく、任意の値を設定することができます。
通常apacheを使っているとaccess_logが出力されており、 リクエスト時刻やステータスコード、User-Agentなんていうものが出力されています。
要はアクセスログにユーザIDくっつけて出力しちゃえば簡単に取れるんじゃないかと。
今回はPHPです。
Frameworkは特に指定しませんが、filterやAuthなど適切な場所でapache関数を使い、ログのフォーマットに出力の指定を行います。
apache関数はいくつかありますが設定する関数は2つ。
apache_setenvとapache_noteがあります。
apache_note
apache_note — Apacheリクエスト記号(note)を取得/設定する。 この関数は、Apache の table_get および table_set のラッパーです。 リクエスト中に存在す>る note のテーブルを編集します。 このテーブルは、Apache モジュール間の通信に用いるものです。
apache_setenv
apache_setenv — Apacheサブプロセスの環境変数を設定する apache_setenv() は variable で指定された Apache 環境変数の値を設定します。
見た感じだとapache_noteのほうが今回の件に関しては適切かな? setenvって何か設定値を環境せ変数に設定したりするイメージ。
ということでamache_noteを使います。
apache_note('X-User-ID', $userId);
こんな感じで書いてあげます。
さらにApacheのlog出力設定部分のフォーマットに以下を追加
# %{X-User-ID}nを追加 LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b %D \"%{Referer}i\" \"%{User-Agent}i\" %{X-User-ID}n" web-combined
設定後はapacheの再起動を忘れないように。
# service httpd restart
こうすることによってアクセスログにユーザIDを追加することができました。