ASP.NET Global.asax error logger

You probably know that you should never show ASP.NET error message to the client. Method below should be placed in Global.asax, so it would send error notification to the developer in case of any error. Email is going to have details of exception, URL of the page, referer page, IP address of the client, Form and Session values, user name of logged user if logged in.  Response would be transfered to general error page, which not gonna have any details of actual exception. If error page has an error ( it happens if masterpage has error) then methods simply prints error message using Response.Write.

 void Application_Error(object sender, EventArgs e)

 {

    // Code that runs when an unhandled error occurs

    string testEnvironment = ConfigurationSettings.AppSettings["isTestEnvironment"];

    if (testEnvironment == "0")

    {

        Exception ex = Server.GetLastError();

        StringBuilder theBody = new StringBuilder();

        theBody.Append("URL: " + Request.Url + "\n");

        theBody.Append("Referer: " + Request.ServerVariables["HTTP_REFERER"] + "\n");

        theBody.Append("IP: " + Request.ServerVariables["REMOTE_HOST"] + "\n");

        theBody.Append("Error Message: " + ex.ToString() + "\n");

        if (User.Identity.IsAuthenticated)

            theBody.Append("User: " + User.Identity.Name + "\n");

        else

            theBody.Append("User is not logged in." + "\n");

        theBody.Append("Form Values: " + "\n");

        foreach (string s in Request.Form.AllKeys)

        {

            if (s != "__VIEWSTATE")

                theBody.Append(s + ":" + Request.Form[s] + "\n");

        }

        theBody.Append("Session Values: " + "\n");

        foreach (string s in Session.Keys)

            theBody.Append(s + ":" + Session[s] + "\n");

        System.Net.Mail.MailMessage email = new System.Net.Mail.MailMessage();

        email.IsBodyHtml = false;

        email.From = new System.Net.Mail.MailAddress("errors@karpach.com", "ErrorManager");

        email.To.Add(new System.Net.Mail.MailAddress("errornotification@karpach.com", "Developer"));

        email.Subject = Request.Url.ToString().Split('/')[2] + " has ASP.NET error";

        email.Body = theBody.ToString();

        try

        {

            System.Net.Mail.SmtpClient emailProvider = new System.Net.Mail.SmtpClient();

            emailProvider.Send(email);

        }

        catch (Exception anException)

        {

        }

        finally

        {

            if (Request.Url.Segments[Request.Url.Segments.Length - 1].ToLower() != "error.aspx")

                Response.Redirect("~/error.aspx?msg=4");

            else

            {

                Response.Write(@"We encountered an internal error. We apologize for any inconvenience

                but know that our staff gets emailed EVERY error that occurs so that we can solve it promptly.");

                Response.End();

            }

        }

    }

 }


Wednesday, March 19, 2008 | Add Comment

New Comment

Your Name:
Email (for internal use only):
Subject:
Comment:
 
Code above:

Categories

Recent Tweets

Valid XHTML 1.0 Transitional