ライブ/プロダクションWebアプリケーションでのエラー追跡
-
04-07-2019 - |
質問
私は現在、社内で作成された多くのカスタムアプリケーションを持つ会社で働いています。現在、多くのことに対する標準はありません。このプログラムで発生するエラーを記録/追跡する方法を実装したいと思います(ほとんどはasp.netです)。
現在、Application ErrorメソッドのGlobal.asaxでこれを処理することを考えています。最初に情報をエラーログ/追跡データベースに保存し、それが失敗した場合は、電子メールを送信してみてください。
エラーメッセージやその他のアプリケーション変数(ページ、ユーザー名など)から取得するのに最も役立つ情報の種類。
現在、2つのテーブルを使用することを考えています。1つは一般的なエラーとアプリケーション情報を取得し、もう1つは例外情報を保持します。これは、1つのアプリケーションレベルの例外から発生する可能性のある内部の例外を処理する1対多の関係になります。
多くの詳細が欠落していると確信しており、この問題を処理するための戦略をお聞きしたいと思います。
解決
Jeff Atwoodは、 CodeProject
できるだけ多くの情報を収集しようとします。 スタック情報 セッション情報 エラーの場所
また、アプリケーションが例外情報をシステムに保存するために呼び出すWebサービスをセットアップします。
他のヒント
ELMAH があなたが探しているものかもしれません。
ロギングライブラリ(Log4Netなど)を使用する場合、コードで単一のログ呼び出しを行いながら、電子メール、DB、ファイル、イベントログなどにログを記録するためのさまざまなロギングアペンダーを設定できます。この投稿は、取得に必要なすべてをカバーしています開始しました。
ASP.NETヘルスモニタリングもあります。
>編集:別のポスターはELMAHに言及しており、ASP.NETエラーの記録に最適で、実行中のアプリに動的に「注入」できます。
これは私がしていることですが、メールの問題が原因でバグが発生しています。
DBに何かを保持することはありません。DBにエラーがある場合、DBにそのエラーが発生することはありません。論理的に、挿入は失敗します!
したがって、bugs @ mydomain.comのような特別なメールアドレスにメールを送信します
件名:[アプリケーション名] [タイムスタンプ:ddmmyyyy hhmmss] メッセージ:アプリケーション、エラーメッセージ、スタックトレース情報、ユーザー名などのセッション変数、リファラーなどのサーバー変数。
ASP.NET開発者の親友は スタックトレース情報です。ここで、何が問題で、何がコールで、どこで発生したかがわかります。呼び出していました。
このシステムにある唯一の問題は、電子メールに問題がある場合(電子メールの送信時の例外)、何も取得できないことです。そのため、毎月のXMLファイル[errorLog_ mmm_yyyy.xml]も作成し、単純な「ドラッグアンドドロップ」;エラーを確認したい月と年のXMLをロードしたグリッドビューのあるページ。
try
{
// production code
}
catch(Exception ex)
{
Utilities.Mail.SendError(ex);
}
または最良の方法:global.asaxの Application_Error に追加します:
<%@ Application Language="C#" %>
<%@ Import Namespace="System.Diagnostics" %>
<script language="C#" runat="server">
void Application_Error(object sender, EventArgs e)
{
//get reference to the source of the exception chain
Exception ex = Server.GetLastError().GetBaseException();
//log the details of the exception and page state to the
//Windows Event Log
EventLog.WriteEntry("myWebApplication name",
"MESSAGE: " + ex.Message +
"\nSOURCE: " + ex.Source +
"\nFORM: " + Request.Form.ToString() +
"\nQUERYSTRING: " + Request.QueryString.ToString() +
"\nTARGETSITE: " + ex.TargetSite +
"\nSTACKTRACE: " + ex.StackTrace,
EventLogEntryType.Error);
Utilities.Mail.SendError(ex);
}
</script>
上記のコードを使用してイベントログにエラーを追加し、SendError(Exception)関数でXMLファイルにエラーを追加します。
https経由で到着した潜在的に機密性の高い情報を記録する場合は、十分に注意してください。ユーザーは、エンドツーエンドで暗号化されることを期待します(法的要件である可能性があります)。プレーンメールで送信しないようにしてください。
通常、get、post、cookie、フォームの状態(ASPNET)、ユーザーエージェント、その他のヘッダー、日付/時刻、サーバーマシンなどを含むすべてのリクエストを記録します
ただし、場合によっては永続的に記録するはずのない情報が記録される場合があります(クレジットカード番号が支払いプロバイダーに渡されるなど)。メールで送信するのはさらに悪い。
HTTPSがオンになっているかどうかを確認する価値があります。オンになっている場合は、ログに記録する情報量を減らして、この問題を回避してください。フィールドが空か空でないかを示す文字列を送信しました。
実際には、あなたは解決策をよく考えたように聞こえます。
私はWeb開発ショップで働いているので、エラーのログに加えて、dbクエリの失敗などのシステムの重大なエラーもメールで送信されるので、すぐにジャンプして修正できます。
検討する代替案は、各アプリケーションでスローされた各エラーに関する情報と、電子メールで必要な関連情報を提供するレポートを毎日電子メールで送信することです。
すべてのエラーをそのアプリケーションの単一のテーブルに記録します(もちろん、データベースがすべて社内に含まれているアプリケーションで作業する場合は、エラーのタイムスタンプとまた、電子メールで送信された例外メッセージ。
例外メッセージには関数トレースが含まれているため、元の呼び出し関数が何であったか、スタック内のすべての関数のファイル番号と行番号がわかります。これにより、特定のバグを非常に簡単に追跡できます。
データベースへのログ記録が失敗した場合、サーバーのイベントログまたはLog.txtファイルに書き込むことができます。ここでの選択は、それらを含むWebサーバーにアクセスできるかどうかに一部依存します。
迅速な対応が必要な場合は、エラー通知メールを送信することをお勧めします。しかし、それらをスキャンするエラーのリストはありません。
これを行うには、ユーザー情報(ID、利用可能な場合は名前)、すべてのセッション変数、すべてのフォーム変数(フォームの設定方法とユーザーが入力した)、およびエラーが発生した場所(どのページ、どのクラス、どのメソッド)のスタックトレースを超えた何らかの指標。また、呼び出されたストアドプロシージャの名前と送信されたパラメータ、またはSQL自体を含めます。また、すべての例外プロパティ(スタックトレースなど)。そして、DisplayMessageおよびInternalMessageフィールド。 DisplayMessageがユーザーに表示されます。 InternalMessageはログに記録され、デバッグモードのときにカスタムエラーページに表示されます。
ベースページのPage_Errorで、Application_Errorのフェールセーフとしてログを記録します。
時々、web.configにキーと値のペアを追加して、電子メールアドレス(または配布リスト)を含めます。そのキーに値がある場合、通知メールが送信されます。値がない場合、eomailは送信されません。その後、テスト中または初期の生産中に、問題の個人的な通知をすぐに受け取ることができます。最初の期間が過ぎたら、web.configでメールアドレスを削除します。
ロギングは良好ですが、アプリケーションの監視の方が優れています。
注意:私はCALMの著者です
ウェブサイトのエラー報告アプリケーションに不満を感じていたため、Clearwind Consultingで独自の記事を作成しました。これは無料で、プロジェクトで内部的に使用しています。完全なエラーコード、ブラウザの種類、トレースバック、エラーの原因となったコードのスニペット、30日以上にわたってグラフ化されたエラー頻度などの完全なエラー情報を提供します。 Clearwindでは、Webアプリケーション開発を行っています。ウェブサイトについて効率的に使用できる実際のデータを提供するツールが必要でした。
ウェブサイトでエラーが発生したときに通知を受け取る方法を選択できます。 RSS、電子メール、またはあなたに最適な方法はすべて、エラー通知を取得するために使用できます。はい、飲み物を飲んでいる間、iPhoneにエラーを送信できます。 Djangoで完全に記述されているため、データにタグを付けたりフォーマットしたりする場合は、JSON、RoR、XML、CSVなどを使用できます。または、ウェブサイトにアクセスしてください。
必要に応じて、www.areciboapp.comをご覧ください。
無料で、どのWebサイトにも簡単に追加(またはWebサイトから削除)でき、エラーを修正するための実際の情報を提供するだけでなく、404だけではありません。ぜひ招待して、あなたとあなたのWebサイトに役立つかどうかを確認してください。そうなると思います。
サーバー上のカスタムイベントログ、およびその他のロギング&amp;お知らせ。エラーの原因がインフラストラクチャの問題である場合、同じ問題により、エラーハンドラーが電子メールを送信したり、データベースに保存したりすることもできなくなる可能性があります。