アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

Apacheのアクセスログにユーザ情報を追加する

こんにちは、中川です。

日々の運用をしていると、サービス運用の担当者から「管理画面で、あの操作はだれがやったか調べられませんか?」なんて質問を受けることがあります。

しっかりと操作ログをとるようなシステム要件でないとApacheのログを追うしかありませんが、通常はIPアドレスやブラウザ程度しか調べようがありませんよね。。。

しかし、初期開発であらゆる操作ログをしっかりシステムに組み込む余裕なんてないという場合もあります。そんな時のために事前にやっておくとちょっと便利で、非常に簡単なTIPSを。

-------------------------------------------------
■追記
dandaso様 よりコメントいただきました。
確かにApacheへのログ用途ですので、apache_noteを利用するのが適切ですね。
dandaso様ご指摘ありがとうございます。

apache_noteを利用した場合の例も追加させていただきます。

apache_note関数の利用



apache_note('ADMIN_ID', 'ログイン中のID等');


apacheのLogFormat



%{ADMIN_ID}n


apache_noteで検索かけてみたところ、ずばりそのものな以下の記事が見つかりました。Cookieをログに出す際の問題点にも触れておられますので、ご覧になってみてください。
apacheのログに好きな情報を出す方法(PHP編)| Web屋のネタ帳

-------------------------------------------------


■概要
phpではApacheサブプロセスの環境変数を設定する、apache_setenv関数というものがあります。
これとApacheのログ設定を組み合わせれば、access_logに任意のログを出力することができます。

PHP側の記述


apache_setenv('ADMIN_ID', 'ログイン中のID等');


httpd.conf



# combinedのLogFormatに、%{ADMIN_ID}e を追加
 
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{ADMIN_ID}e\"" idcombined
 
CustomLog "logs/access_log" idcombined


と、たったこれだけで、access_logに任意の値を追加することができます。
symfonyでのプロジェクトでは、共通アクションのpreExecute内でapache_setenvしてあげるだけですね。

Cookieの値をログに出力
ちなみに、わざわざapache_setenvしたくないという場合には、Cookieの値をログを出力することもできます。
たとえば、cookieにADMIN_IDという値を仕込んだ場合は、
以下のフォーマットをLogFormatに追加します。



%{ADMIN_ID}C


このように非常に簡単にaccess_logに任意の値を色々と追加することができます。
他にもapacheのログには色々出力することができますので、調べてみてください。

※フォーマットを追加する際は、既存のフォーマットの間に入れるとログ解析などで、面倒なことになる場合がありますので、なるべく最後に追加してあげればいいかと思います。

■参考
http://httpd.apache.org/docs/2.2/ja/mod/mod_log_config.html

■最後に
最近ちょこちょことApacheの設定をいじることがあり調べていたのですが、
Apacheで、かなり色々なことができるものだと改めて感心しているところです。
暇つぶしには、Apacheのマニュアルを流し読みなんてのもいいかなと思いました。