Custom Error Logging

 Rate It (8)

This article presents a way to log and mail the errors from any web page.

It logs following details -

  • Control on which the error is raised
  • Page which controls the error
  • Error Description
  • Trace Messages
  • Server and Client details

Log is created in log folder under root directory.

 
Source code is provided in class file errorHandler.cs 111111111



using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Net.Mail;
using System.IO;


/// <summary>
/// this class is designed to log errors and send mails regarding
/// runtime errors in myweb portal.
///
/// Developer : yeotumitsu@sify.com
/// Date: 24-04-2008
/// Modified on: 25-04-2008
/// </summary>

public enum MessageType // enum is accessed to provide the operation to be done
{
    EventLog,
    SendMail,
    MailAndEventLog
}


public class errorHandler
{
    public MessageType MsgType
    {
        get
        {
            return this.MT;
        }
        set
        {
            this.MT = value;
        }
    }

    public MessageType MT = new MessageType();
  
    public string EmailReciever = "";
    public string LogName = "";
    public string MailServer = "";
    public string MailSubject = "Error Report " + HttpContext.Current.Request.ServerVariables["SERVER_NAME"];
    

    public errorHandler() // sets default values of the fields
    {
        this.MailServer = ConfigurationSettings.AppSettings["MailServer"];
        this.EmailReciever = ConfigurationSettings.AppSettings["MailReciever"];
        this.LogName = ConfigurationSettings.AppSettings["LogName"];
    }

    /// <summary>
    /// function errorHandler overloaded.
    /// sets the default values if provided by the user.
    /// </summary>
    /// <param name="_mailserver"> SMTP server IP </param>
    /// <param name="_mailreciever"> E mail id of person who is supposed to recieve error mails </param>
    /// <param name="_logname"> name of the error log </param>
  
    public errorHandler(string _mailserver, string _mailreciever, string _logname)
    {
        this.MailServer        = _mailserver;
        this.EmailReciever    = _mailreciever;
        this.LogName        = _logname;
    }

    /// <summary>
    /// raiseError is called to select the operation to be done
    /// </summary>
    /// <param name="_message"> any message </param>
    /// <param name="ex"> exception  </param>
    public void RaiseError(string _message, Exception ex)
    {
       switch (this.MT)
        {
            case MessageType.EventLog:
                SaveToEventLog(_message, ex);
                break;
            case MessageType.SendMail:
                sendErrorMail(_message);
                break;
            case MessageType.MailAndEventLog:
                SaveToEventLog(_message, ex);
                sendErrorMail(_message);
                break;
            default:
                break;
        }
    }

    /// <summary>
    /// Sends mail to the person specified to recieve mails
    /// </summary>
    /// <param name="_message"> message to send </param>
    /// <returns> </returns>
    public int sendErrorMail(string _message)
    {
        MailMessage errorMessage = new MailMessage();
        errorMessage.To.Add(new MailAddress(this.EmailReciever));
        errorMessage.Subject = this.MailSubject;
        errorMessage.IsBodyHtml = true;
        errorMessage.Priority = MailPriority.High;
        errorMessage.Body = _message + " Please check log for more information.";
        SmtpClient clientSmtp = new SmtpClient();
        try
        {
            clientSmtp.Send(errorMessage);
        }
        catch
        {
            return 0;
        }
        return 1;
    }


    /// <summary>
    /// Formats and logs error
    /// </summary>
    /// <param name="_message"> any message </param>
    /// <param name="ex"> exception  </param>
  
    private void SaveToEventLog(string _message, Exception ex)
    {
        try
        {
            string strPhysicalApplicationPath = HttpContext.Current.Request.PhysicalApplicationPath;
            string strFileName = strPhysicalApplicationPath + "Logs\\" + LogName + DateTime.Now.ToString("ddMMMyyyy") + ".txt";
            string strBody = string.Empty;
            FileInfo fInfo = new FileInfo(strFileName);

            strBody = _message + Environment.NewLine + Environment.NewLine;
            strBody +=  "Server Address :: " + HttpContext.Current.Request.ServerVariables["SERVER_NAME"] + Environment.NewLine;
            strBody += "User Address   :: " + HttpContext.Current.Request.ServerVariables["REMOTE_HOST"] + Environment.NewLine;
            strBody += "Script Name    :: " + HttpContext.Current.Request.ServerVariables["SCRIPT_NAME"] + Environment.NewLine;
            strBody += "Query Data     :: " + HttpContext.Current.Request.Url.Query + Environment.NewLine;
            strBody += "Occured At     :: " + DateTime.Now + Environment.NewLine + Environment.NewLine;
            strBody += "################################## -- Start of Error  -- #################################" + Environment.NewLine;
            strBody += ex.StackTrace + Environment.NewLine;
            strBody += "################################### -- End of Error -- ###################################" + Environment.NewLine + Environment.NewLine;
            strBody += HttpContext.Current.Request.ServerVariables["ALL_HTTP"] + Environment.NewLine;

            DirectoryInfo dInfo = new DirectoryInfo(strPhysicalApplicationPath + "Logs\\");
            if (!dInfo.Exists)
            {
                dInfo.Create();
            }

            if (fInfo.Exists)
            {
                FileStream fStream = new FileStream(strFileName, FileMode.Append, FileAccess.Write);
                StreamWriter sWriter = new StreamWriter(fStream);
                sWriter.WriteLine(strBody);
                sWriter.Close();
            }
            else
            {
                FileStream fStream = new FileStream(strFileName, FileMode.Create, FileAccess.Write);
                StreamWriter sWriter = new StreamWriter(fStream);
                sWriter.WriteLine(strBody);
                sWriter.Close();
            }
        }
        catch (Exception e)
        {
            sendErrorMail(e.Message);
        }
    }
}


Web config serrings -  

 <appSettings>
        <add key="MailServer" value="127.0.0.1"/>
        <add key="MailReciever" value="you@yourSite.com"/>
        <add key="LogName" value="EmpostErrLog"/>
    </appSettings>
    <system.net>
        <mailSettings>
            <smtp from="admin@yourSite.com">
                <network host="127.0.0.1"/>
            </smtp>
        </mailSettings>
    </system.net>

 


Calling the method -

 catch(Exception ex)
        {
            string strMsg = "Date : " + DateTime.Now.ToString("dd/MMM/yyyy HH:mm:ss") + "  Error : " + ex.Message + " Control : " + ((Control)sender).ClientID.ToString() + " Page :  " + Page;
            errorHandler objErrorHandler = new errorHandler();
            objErrorHandler.MsgType = MessageType.MailAndEventLog;
            objErrorHandler.RaiseError(strMsg,ex);
        }

 

 


Hope it Helps. 

 

Revision number 1, Saturday, April 26, 2008 10:21:43 AM by
This is not the most up to date version of this article. The most recent version can be found here.

Comments

ok,it's good;

but i think that using Microsoft exception handling application block is a better way.

I was not able to synchronize enterprise library 3.1 to .net framework 3.5, thats why this module was written. if you have any way to synchronize exception handling application block 3.1 to .net 3.5 please do tell us.

Shortcuts

Table of Contents

Top Wiki Contributors

(last 30 days)

  1. mbanavige (25)
  2. gilfink (14)
  3. MisterFantastic (10)
  4. anas (6)
  5. rohanisbond (4)
  6. PaulSpencer (3)
  7. random0xff (2)
  8. wejop (1)
  9. vik20000in (1)
  10. joycsharp (1)

Advertise Here

Microsoft Communities
Page view counter