弊社は、CakePHP3.5のアプリケーションが動くWebサーバの手前にAWSのALB(Application Load Balancer)が存在します。
独自のアプリケーションログに関しては、X-Forwarded-Forヘッダを参照し、ログに出力していたのですが、cakephp3が提供するログに関してはデフォルトのままの運用となっていました。
2018-03-02 03:36:53 Error: [Cake\Network\Exception\XxxxxxException] Xxxxxxxxxx in /aaa/bbb/ccc/ddd/YyyyyyyyController.php on line 155
Request URL: /eee/ffff/
Client IP: {ロードバランサーのIPアドレス}
Stack Trace:
# 0 ......
これが、エラー発生時にデバッグしづらい!!
- エラーの発生時間帯を確認
- msec単位で同じくらいの時間帯をある程度幅でおぼえておく
- アクセスログとつきあわせ
- URLが同じやつはどこだー
なんてことをたまにやってて、もう我慢できない!ということになりました。
バージョン
- CakePHP v3.5.13
- PHP 7.2.3
どうやるか
とりあえず、公式ドキュメントを見てみましょう。
そう、たった1行でできちゃいます。
AppController.php
// initialize()メソッドに追記
$this->request->trustProxy = true;
X-Forwarded-ForヘッダをCakePHPのアプリケーションで使うためには、上記の設定を入れます。
2018-04-01 13:45:55 Error: [Cake\Network\Exception\XxxxxxException] Xxxxxxxxxx in /aaa/bbb/ccc/ddd/YyyyyyyyController.php on line 121
Request URL: /eee/ffff/
Client IP: {リクエスト送信元のIPアドレス}
Stack Trace:
# 0 ......
これで、エラーが発生したときに、一目で送信元が特定できるようになりました!
GoogleのクローラーのIPアドレスがある程度把握できているので、実際のお客様のエラーなのかクローラーのエラーなのかが瞬時に判断つくので、めっちゃ便利です。