Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

ApacheアクセスログにユーザIDをうまく記録する方法

はじめに

Apacheアクセスログを見返すときに、「ログ上にユーザIDが記録されてたら便利なのにな」とか思うことありませんか?
プログラム内で使われる各種情報をアクセスログに連携するためのベストプラクティスをご紹介します。

前提条件

  1. プログラム内の変数値をApacheアクセスログに記録できる
  2. Webサーバからクライアントには変数値を直接出力しない
  3. Apache 2.4.7以降で使用可能

実装方法

プログラムからは、適当なヘッダとして出力する。

// PHPでの実装例
header("X-User-Id: 1234");

ユーザID情報を直接ユーザに出力したくないので、Apache上で以下のように設定する。

# mod_headersを有効化
LoadModule headers_module modules/mod_headers.so
# レスポンスヘッダをnoteとしてxuseridに設定
Header always note X-User-Id xuserid
# レスポンスヘッダ出力を抑制
Header always unset X-User-Id
# 以下例ではログ末尾にユーザID情報を追加
LogFormat "%h %l %u %t \"%r\" %>s %b %{xuserid}o" common

Apache 2.2で実現したい場合

Apache 2.2.x では標準でレスポンスヘッダ削除&ログ出力ができません。
以下のモジュールを使うことで実現可能でした。
https://github.com/kazeburo/mod_copy_header

LoadModule headers_module modules/mod_headers.so
LoadModule copyheader_module modules/mod_copy_header.so
<IfModule copyheader_module>
  CopyHeaderActive On
  CopyHeader X-User-Id
</IfModule>
Header unset X-User-Id
LogFormat "%h %l %u %t \"%r\" %>s %b %{X-User-Id}n" common

さいごに

上記の例ではユーザIDを出力していますが、その他にもログに残しておけば便利なものが多いのではないでしょうか。
それではみなさん、快適なログライフを!

mediado
私たちメディアドゥは、電子書籍を読者に届けるために「テクノロジー」で「出版社」と「電子書店」を繋ぎ、その先にいる作家と読者を繋げる「電子書籍取次」事業を展開しております。業界最多のコンテンツラインナップとともに最新のテクノロジーを駆使した各種ソリューションを出版社や電子書店に提供し、グローバル且つマルチコンテンツ配信プラットフォームを目指しています。
https://mediado.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away