CodeIgniter エラー検知通知メールを送信する
前説
アプリケーションの運用管理において、エラーが発生した際に、それを検知し、保守担当チームにエラー検知通知メールを送信することが当然な話ですが、残念ながら、小規模ECサイトなどのWEBアプリケーションにおいて、予算や認識などいろいろな要因で、エラー検知手段を設けずに、あとからエンドユーザーのクレームにより、初めてエラーが発生したことが分かったことが多いそうです。
それはサービスの品質の改善、向上に非常に良くないため、プロジェクトの要件定義段階で、「エラー検知通知メールを送信する」を要件に入れて、お客様に説得し、実現しましょう。
実現方法は2通しかないと思います。一つは、JP1などの運用管理ツールを導入することです。運用管理ツールはいろんな素晴らしい機能が付いていますが、導入費用がとても高いため、中小企業には、向いていないと思います。もう一つの方法は、自力で実現することです。今日はこの方法を中心に話させて頂きたいと思います。
それでは、今回は、「CodeIgniter エラー検知通知メールを送信する」というテーマで、CodeIgniterフレームワークにおいて、エラー通知メールの実現方法を紹介したいと思います。CodeIgniterと言っても、考え方は同じなので、ほかのフレームワークにも通用ではないかと思います。そこは皆さんのご判断に任せます。
前提
・CodeIgniterバージョン:3.1.3
※バージョン:3.1.6でも使えますので、3.X系はいけそうではないかと思います。
要件
システムエラーが発生した際に、発生した時間、内容をリアルタイムで保守チームにメールを送信すること。つまり、エラー検知通知メールを送信することです。
考え方
考え方は簡単です。エラーハンドリングのところに、ついでに、エラー検知通知メールを送信すれば、済むということです。
CodeIgniterのエラーハンドリングについては、こちらのCodeIgniter エラーログの出力をご参考し、詳細は割愛させていただきます。
1.エラーハンドリング
CodeIgniter エラーログの出力にも記載しておりますが、エラーハンドリングは2箇所があります。system\core\Common.phpの_error_handlerメソッドと_exception_handlerメソッドです。
エラーログを出力した後に、エラーの発生時間と内容をメールにも出力すれば、完成です。1点注意するところがあり、エラーメッセージが長い場合、メール送信したら、読みづらいため、最初の100文字とか、1000文字とかだけをメールに記載すれば良いかと思います。
エラー検知通知メールを送信することは、あくまで、エラーが発生しましたよという通知することで、具体的な内容はあとで、運用担当者はエラーログを確認する際に、全てが分かりますので、簡単な内容だけ通知すれば良いかと思います。
1 2 3 4 5 6 7 |
$msg["datatime"] = date('Y/m/d H:i:s,'). $datatime[1]; $msg["contents"] = $filepath . ' ' . $line . ' ' . mb_substr($message,0,1024);//エラーメッセージの先頭1024文字だけをメールに記載する send_error_mail($msg); // エラー検知通知メールを送信する |
上記のソースは、_error_handlerメソッドのサンプルです。_exception_handlerメソッドは(ファイル名と行数)若干違いますが、考え方が同じです。
2.エラー検知通知メールを送信する関数
コアのエラー検知通知メールを送信する関数です。関数名は長くて難しそうに見えますが、本質的なところ、簡単、メール送信です。
メール本文は、Smartyを使って、発生時間などの変数が置換することにします。簡単なので、一気にサンプルを上げます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
function send_error_mail($msg) { $subject = "【重要】エラー検知通知メール"; // 実際に定数化にしたほうが良いかと思います。 // 本文のテンプレート ob_start(); include VIEWPATH_TPL."mail/error_mail.tpl"; $mailbody = ob_get_contents(); ob_end_clean(); // 本文の変数の代入 $mailbody = str_replace ("%datatime%", $msg["datatime"], $mailbody);//エラーハンドリング時のエラー発生時間 $mailbody = str_replace ("%contents%", $msg["contents"], $mailbody);//エラーハンドリング時のエラー発生内容 $from = "From:" . "sample@dummy.co.jp"; // 実際に定数化にしたほうが良いかと思います。 mb_send_mail("monitor@dummy.co.jp", $subject, $mailbody, $from); } |
3.エラー検知通知メール本文
エラー検知通知メール本文error_mail.tplの中身です。簡単なので、説明を割愛させていただきます。
1 2 3 4 5 6 7 8 9 10 |
○○○にてエラーが検知されました。 運用保守チームに確認を依頼してください。 発生時間:%datatime% エラー内容: %contents% |
まとめ
今回は「CodeIgniter エラー検知通知メールを送信する」というテーマで、エラー発生時のメール送信方法を紹介しました。いかがでしょうか。簡単ですよね。個人的に、CodeIgniter エラーログの出力をマスタすれば、エラー検知通知メールを送信することは、単なるメール送信に過ぎないと思います。
それでは、以上です。
ディスカッション
コメント一覧
まだ、コメントがありません