エラーログの扱い方を考える@PHP技術
※この記事は主の勘違いとよくわかってないところが含まれています。
PHPではデバッグ機能が備わっていて、エラーが発生するとブラウザへ出力されます。
開発をする時にはこの機能は便利なのですが、運用段階では問題になることがあります。
開発段階と運用段階でエラーログを別々に考えなくてはなりません。
サイトっぽいものを作っているのですが、最近エラーやログについてどうしようか気になってきたので調べることにしました。PHPサイバーテロの技法の本にも書かれています。
ここでのエラーはPHP本体のエラーに加えてシステム内部での(開発者が定義した)エラーも含みます。
※本書ではエラーレベルについて"厳しく"、"落とす"、"上げる"といった表現を使っていますが、主はどっちがよりクリティカルなレベルに収束させるのかわかりませんでした。
なので、ここでは暫定的に定義します
上[ERROR] |[WARNING] | 下[INFO] INFOレベル=ERRORレベル〜INFOレベルまで全部
こんな感じで。本当は各レベルで分離していると思うのですが、こう解釈したほうが自分的にスムーズだったので。
そこで、開発段階と運用段階で出力すべきエラーの扱い方を考えてみました
- 開発段階
- INFOレベルから表示
- 内部エラー(開発者が定義したエラー)
- 運用段階
- ERRORレベルのログ出力
- エンドユーザーにも理解できるメッセージ及びその対処方法(管理者へ問い合わせてください的なやつ)
多分、運用段階だとエラーレベルを下げるとログ出力にタスクが取られて良いパフォーマンスを出すことができないかもしれないのでERRORレベル
ここで大事なのは、開発段階において、デバッグしやすいレベルを選ぶことと、運用段階でエンドユーザー(もしくはログ)から得た情報からメンテナンスができるかだと思います。
で、本書にはどう書いてあるかというと…
[開発段階] error_reporting = E_ALL display_errors = On display_startup_errors = On log_errors = Off [運用段階] error_reporting = E_ALL & ~E_NOTICE display_errors = Off display_startup_errors = Off log_errors = On error_log = (ログファイルパス)
とのことです。
大まかに、
開発段階→画面にエラーを表示させる
運用段階→ログにエラー出力
という方針です。
ううむ、開発者が扱うシステムエラーとエンドユーザーに伝えるエラーの扱い方までは言及されてなかった…他サイトから調べようと思います