2

現在、Global.asax Application_Error() のエラーを処理する次のコード スニペットがあります。

    var ex = server.GetLastError();
    server.ClearError();
    if (ex is HttpUnhandledException && ex.InnerException != null)
        ex = ex.InnerException;
    Trace.TraceError(ex.ToString());
    // send some output to the user that they should contact support etc

たとえば、404 エラーを含むすべてのエラーをキャッチします (ユーザーが存在しない .aspx URL を入力した場合、またはブラウザーが favicon.ico などを要求し、パイプラインを通過するように静的ファイル要求が設定された場合)。これには 2 つの問題があります: これはログに記録されるべきではなく (ログは役に立たない 404 エラーでいっぱいです)、元の HTTP コードは送り返されなければなりません (そうしないと、検索ボットがエラー ページなどをインデックス化する可能性があります)。

ここで何をログに記録し、何を無視するかをどのように決定しますか? 基本的に、バグを示すアプリケーション/ビジネス エラーを含め、「通常の」HTTP エラーを無視したいと考えています。また、404 エラーだけを除外したいだけではなく、403 もあり、他に何があるかはわかりません。

4

3 に答える 3

2

あなたのアプローチは良いです: 未処理のエラーをログに記録します。そのポイントは、バグを取り除くことです。人間はバグを避けることはできませんが、すぐに修正できます。

すべてのエラーをログに記録することから始めます。次に、個々のエラーまたは役に立たないとわかったエラーのカテゴリをブラックリストに登録します。数回の反復で、かなりクリーンなログが得られます。

実行できないものはすべて削除します。たとえば、あなたのウェブサイトには、クレイジーなリクエストなどを実行するボットがあります。アクションは不要なので、ログから削除できます。

役に立たないように見えるエラーも補助ログ ファイルに記録し、時々スクロールして問題がないことを確認することをお勧めします。

特に、通常は無害なエラーの頻度を知りたい場合。1 日 3 回のデッドロックは問題ないかもしれませんが、300 回は多すぎるかもしれません。

グローバルエラーハンドラーに含まれる可能性のあるもののスケッチを提供します。

static bool IsExceptionIgnored(Exception exception)
{
    if (exception == null) throw new ArgumentNullException("exception");

    var nestedExceptions = exception.GetExceptionChain();
    return nestedExceptions.Any(ex =>
        ex is ViewStateException ||
        ex.Message.Contains("Timeout") ||
        ex.Message.StartsWith("Invalid viewstate") ||
        ex.Message.Contains("potentially dangerous") ||
        ex.Message.Contains("The remote host closed the connection") ||
        ex.Message.Contains("System.Web.UI.ViewStateException: Invalid viewstate") ||
        ex.Message.Contains("System.Web.Hosting.IIS7WorkerRequest.RaiseCommunicationError") ||
        ex.Message.Contains("0x80070032") ||
        (ex is HttpException && ((HttpException)ex).GetHttpCode() == 404) ||
        ex is ThreadAbortException);
}
public static IEnumerable<Exception> GetExceptionChain(this Exception exception)
{
    if (exception == null) throw new ArgumentNullException("exception");

    for (var current = exception; current != null; current = current.InnerException)
        yield return current;
}
于 2013-10-15T09:57:15.463 に答える