旅するえんじにあ - Engineers to Travel -

旅するエンジニアの気まま備忘録

【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を追加することができました。