はじめに
Apacheアクセスログを見返すときに、「ログ上にユーザIDが記録されてたら便利なのにな」とか思うことありませんか?
プログラム内で使われる各種情報をアクセスログに連携するためのベストプラクティスをご紹介します。
前提条件
- プログラム内の変数値をApacheアクセスログに記録できる
- Webサーバからクライアントには変数値を直接出力しない
- 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を出力していますが、その他にもログに残しておけば便利なものが多いのではないでしょうか。
それではみなさん、快適なログライフを!