开发者

sugestions on global error handler to get dump of diagnostic data

开发者 https://www.devze.com 2023-01-26 04:13 出处:网络
there are loads of resources that show how to use global.ascx global error event handler to capture u开发者_如何学Gon-managed errors in the web application but i am yet to find a good sample of code t

there are loads of resources that show how to use global.ascx global error event handler to capture u开发者_如何学Gon-managed errors in the web application but i am yet to find a good sample of code to include in this method that will report on major topics like error message, an output of stack trace, page that generated the error, the user-name/ role that generated the error... and the such.

has anyone used, have, or come across a nice code spinet for this purpose?

thanks in advance.


Your best best it to do nothing. ASP.NET Health Monitoring will write an event to the event log containing most of the data you could need.

If that's not enough information for you, then you should look into wrapping certain of your exceptions in an outer exception which includes the additional data. For instance:

string fileSpec = " ... ";
try
{
    using (var stream = new FileStream(fileSpec))
    {
        // Something
    }
}
catch (IOException ex)
{
    throw new Exception(String.Format("Error processing {0}", fileSpec), ex);
}


Here's what we're using though we may now want to switch to Health Monitoring seeing the other answers to this question.

    public static void LogErrorWithStackTrace(String message, Exception exception,
                                              EventLogEntryType entryType)
    {
        var context = HttpContext.Current;
        var session = context.Session;
        var request = context.Request;
        var errorMessage =
            String.Format(
                @"Message: {0}
                Error in: {1}
                Referer: {2}
                Agent: {3}
                IP: {4}
                Request type: {5}",
                message, request.Url, request.UrlReferrer,
                request.UserAgent, request.UserHostAddress, request.RequestType);
        errorMessage += "\rQuery string variables:";
        errorMessage = request.QueryString.Keys.Cast<string>().Aggregate(errorMessage,
                                                                         (current, key) =>
                                                                         current +
                                                                         "\r   " + key + " = " +
                                                                         request.QueryString[
                                                                             key]);
        errorMessage += "\rForm variables:";
        errorMessage = request.Form.Keys.Cast<string>().Aggregate(errorMessage,
                                                                  (current, key) =>
                                                                  current + "\r   " + key +
                                                                  " = " +
                                                                  request.Form[key]);
        errorMessage += "\rCookies:";
        errorMessage = request.Cookies.Keys.Cast<string>().Aggregate(errorMessage,
                                                                     (current, key) =>
                                                                     current + "\r   " + key +
                                                                     " = " +
                                                                     request.Cookies[key]);
        if (session != null)
        {
            errorMessage += "\rISession:";
            var sess = (ISession) session["session"];
            errorMessage += sess.ToString();
            errorMessage += "\rSession:";
            errorMessage = session.Keys.Cast<string>().Aggregate(errorMessage,
                                                                 (current, sessionKey) =>
                                                                 current +
                                                                 "\r   " + sessionKey + ": " +
                                                                 session[sessionKey]);
        }
        errorMessage += "\rStack Trace:";
        errorMessage += exception.StackTrace;
        WriteEntry(errorMessage, entryType);
        if (!QuietTypes.Contains(exception.GetType()))
            SendExceptionEmail(errorMessage);
    }


This is some VB code we use, it provides enougth info for us to diagnose most problems. Only downside with emailing errors like this is when there is a major failure you can end up with thousands of messages in your mailbox :(

Dim e As Exception

If System.Web.HttpContext.Current.Request.IsLocal Then Exit Sub

e = System.Web.HttpContext.Current.Server.GetLastError
If e IsNot Nothing Then

    If TypeOf e Is HttpException Then
        Dim he As HttpException = DirectCast(e, HttpException)
        If he.GetHttpCode=404 Then
            System.Web.HttpContext.Current.Server.ClearError()
            Response.Redirect("/")
            Exit Sub
        End If
    End If

    MsgBody += "Exception: " & e.Message & vbCrLf & vbCrLf
    MsgBody += e.ToString & vbCrLf & vbCrLf & vbCrLf
Else
    MsgBody += "Unknown Error" & vbCrLf & vbCrLf & vbCrLf
End If

If System.Web.HttpContext.Current.Request.Url Is Nothing Then
    MsgBody += "URL: ?" & vbCrLf & vbCrLf
Else
    MsgBody += "URL: " & System.Web.HttpContext.Current.Request.Url.ToString & vbCrLf
    If System.Web.HttpContext.Current.Request.RawUrl IsNot Nothing Then MsgBody += System.Web.HttpContext.Current.Request.RawUrl & vbCrLf
    MsgBody += vbCrLf
End If


If System.Web.HttpContext.Current.Request.UrlReferrer Is Nothing Then
    MsgBody += "Referer: <direct>" & vbCrLf & vbCrLf
Else
    MsgBody += "Referer: " & System.Web.HttpContext.Current.Request.UrlReferrer.ToString() & vbCrLf & vbCrLf
End If

If User IsNot Nothing Then MsgBody += "User: " & User.Identity.Name & vbCrLf

MsgBody += "User-Agent: " & System.Web.HttpContext.Current.Request.UserAgent & vbCrLf
MsgBody += "User-IP: " & System.Web.HttpContext.Current.Request.UserHostAddress & vbCrLf
MsgBody += "Server: " & System.Environment.MachineName & vbCrLf

MsgBody += vbCrLf & "RequestType: " & System.Web.HttpContext.Current.Request.RequestType() & vbCrLf & vbCrLf        

' dump request items
'   QueryString, Form, Cookies, ServerVariables

MsgBody += "Querystring Variables ================" & vbCrLf
If Request.QueryString.Count > 0 Then
    For Each key As String In Request.QueryString.Keys
        MsgBody += key & " = " & Request.QueryString(key) & vbCrLf
    Next
Else
    MsgBody += "(none)" & vbCrLf
End If
MsgBody += vbCrLf

MsgBody += "Form Variables =======================" & vbCrLf
If Request.Form.Count > 0 Then
    For Each key As String In Request.Form.Keys
        MsgBody += key & " = " & Request.Form(key) & vbCrLf
    Next
Else
    MsgBody += "(none)" & vbCrLf
End If
MsgBody += vbCrLf

MsgBody += "Cookies ==============================" & vbCrLf
If Request.Cookies.Count > 0 Then
    For Each key As String In Request.Cookies.Keys
        MsgBody += key & " = " & Request.Cookies(key).Value & vbCrLf
    Next
Else
    MsgBody += "(none)" & vbCrLf
End If
MsgBody += vbCrLf

MsgBody += "ServerVariables ======================" & vbCrLf
If Request.ServerVariables.Count > 0 Then
    For Each key As String In Request.ServerVariables.Keys
        MsgBody += key & " = " & Request.ServerVariables(key) & vbCrLf
    Next
Else
    MsgBody += "(none)" & vbCrLf
End If
MsgBody += vbCrLf           

' we send MsgBody via email using the System.Net.Mail.MailMessage & System.Net.Mail.SmtpClient classes

' we've handled the error       
System.Web.HttpContext.Current.Server.ClearError()

' depending on the error we redirect to our homepage /default.aspx unless that is the faulting page then redirect to static /error.html
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号