You can use Log4Net logging mechanism and log your unhandled exceptions in a log file in Global.asax's Application_Error .
Link to Log4Net :
Log4Net[
^]
protected void Application_Error(object sender, EventArgs e)
{
System.Web.HttpContext context = HttpContext.Current;
Exception ex = context.Server.GetLastError().GetBaseException();
CLogger.WriteLog(ELogLevel.ERROR, "URL : " + context.Request.Url.ToString()+"\n");
CLogger.WriteLog(ELogLevel.ERROR, "FILE : " + context.Request.FilePath.ToString()+"\n");
CLogger.WriteLog(ELogLevel.ERROR, "USER : " + context.User.Identity.Name+"\n");
CLogger.WriteLog(ELogLevel.ERROR, "MESSAGE : " + ex.Message+"\n");
CLogger.WriteLog(ELogLevel.ERROR, "SOURCE : " + ex.Source+"\n");
CLogger.WriteLog(ELogLevel.ERROR, "STACK TRACE : " + ex.StackTrace+"\n");
CLogger.WriteLog(ELogLevel.ERROR, "INNER EXCEPTION : " + ex.InnerException+"\n");
CLogger.WriteLog(ELogLevel.ERROR, "---------------------------------------------------------------------------------------------\n");
}
Implementation of CLogger class :
using log4net;
using log4net.Config;
public static class CLogger
{
#region Members
private static readonly ILog logger = LogManager.GetLogger(typeof(CLogger));
#endregion
#region Constructors
static CLogger()
{
XmlConfigurator.Configure();
}
#endregion
#region Methods
public static void WriteLog(ELogLevel logLevel, String log)
{
if (logLevel.Equals(ELogLevel.DEBUG))
{
logger.Debug(log);
}
else if (logLevel.Equals(ELogLevel.ERROR))
{
logger.Error(log);
}
else if (logLevel.Equals(ELogLevel.FATAL))
{
logger.Fatal(log);
}
else if (logLevel.Equals(ELogLevel.INFO))
{
logger.Info(log);
}
else if (logLevel.Equals(ELogLevel.WARN))
{
logger.Warn(log);
}
}
#endregion
}
You have to add custom section under web.config file based on what kind of logging you are using (XML, SQL Server, Plain text file etc.)
<log4net>
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<param name="File" value="D:\ApplicationLog.log"/>
<param name="AppendToFile" value="true"/>
<layout type="log4net.Layout.PatternLayout">
<param name="Header" value=""/>
<param name="Footer" value=""/>
<param name="ConversionPattern" value="%d [%t] %-5p %m%n"/>
</layout>
</appender>
<root>
<level value="All"/>
<appender-ref ref="LogFileAppender"/>
</root>
</log4net>