エラーを例外に変換する方法を見つけました。キャッチされない場合は適切に表示しますが、便利な方法でログに記録する方法がわかりません。それらを単にファイルに書き込むだけでは役に立ちませんよね?また、例外の原因がまだわからない場合、データベースにアクセスする危険がありますか?
7 に答える
set_error_handlerを使用してカスタム例外を設定し、エラーをログに記録できます。デフォルトの例外ハンドラーのバックトレースが原因に関する情報を提供できるため、個人的にはそれらをデータベースに保存することを検討します-ただし、データベースハンドラーが例外をトリガーした場合、これはもちろん不可能です。
error_logを使用してエラーを記録することもできます。次のようなメッセージの宛先を選択できます。
error_logより引用
- error_log 設定ディレクティブの設定に応じて、オペレーティング システムのシステム ロギング メカニズムまたはファイルを使用する、PHP のシステム ロガー。これはデフォルトのオプションです。
- 宛先パラメータのアドレスに電子メールで送信されます。これは、4 番目のパラメーター extra_headers が使用される唯一のメッセージ タイプです。
- ファイルの宛先に追加されます。メッセージ文字列の末尾に改行が自動的に追加されることはありません。
編集: マークダウンにはアンダースコアの noparse タグがありますか?
まだインキュベーターから出ていませんが、log4phpのロギングがとても気に入っています。私はほぼすべてで log4net を使用しており、スタイルが私にとって非常に自然であることがわかりました。
システム クラッシュに関しては、エラーを複数の宛先に記録できます (たとえば、問題が発生した場合にのみ機能するしきい値が CRITICAL または ERROR であるアペンダーを使用します)。既存のアペンダーがどれほどフェールセーフかはわかりません.--データベースがダウンしている場合、そのアペンダーはどのように失敗しますか?--しかし、ログに記録できない場合に正常に失敗する独自のアペンダーを非常に簡単に作成できます。
それらを単にファイルに書き込むだけでは役に立ちませんよね?
しかし、もちろんそうです - それは素晴らしいことであり、画面に表示するよりもはるかに優れています。「申し訳ありませんが、私たちは間抜けです。エンジニアは通知されました。戻ってもう一度やり直してください」という素敵な画面をユーザーに表示したいとします。これを行うと、セキュリティ上のリスクが生じるためです。共有メールボックスに電子メールを送信し、例外をファイルまたは DB に記録して、後で確認することができます。これはベストプラクティスです。
私はそれらをファイルに書き込んで、監視システムを設定して、ファイルサイズや最終更新日への変更をチェックするかもしれません。Webmin は簡単な方法の 1 つですが、より完全なソフトウェア ソリューションがあります。
1 回限りのエラーであることがわかっている場合は、通知を電子メールで送信しても問題ありません。ただし、1 分あたりのヒット数が多い Web サイトでは、通知を電子メールで送信しないでください。システムがデータベースに接続できなかったと言う電子メールが毎分何百通も生成されてダウンした Web サイトを見たことがあります。新しいメッセージごとにメール サーバーが実行されているため、LoadAvg が 200 を超えていたという事実も、まったく役に立ちませんでした。その場合、最良のシナリオは、ウォッチドッグがファイルサイズをチェックし、外部サービスに接続して SMS (おそらく IM) を送信するか、外部システムに Web ページでエラーメッセージ (これは画面に表示する必要はありません - HTML コメントに表示できます)。
Google フォームを使用して、PHP の例外をキャッチして記録することもできます。プロセスを説明するチュートリアルがここにあります。
エラーが発生した場所に大きく依存すると思います。DBがダウンしている場合、DBにログを記録することはお勧めできません;)
エラーをログに記録するためにsyslog()関数を使用していますが、syslog をサポートしていないシステムを使用している場合は、ファイルに問題なく書き込むことができます。logwatchや標準の syslogdなどを使用して、電子メールまたは jabber メッセージを送信するようにシステムを簡単に設定できます。