public class CustomHandleLogAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
SaveExceptionAndError(filterContext);
base.OnException(filterContext);
}
private void SaveExceptionAndError(ExceptionContext exceptionContext)
{
string errortime = string.Empty;
string erroraddr = string.Empty;
string errorinfo = string.Empty;
string errorsource = string.Empty;
string errortrace = string.Empty;
errortime = "发生时间: " + System.DateTime.Now.ToString();
erroraddr = "异常位置: " + exceptionContext.RequestContext.HttpContext.Request.Url.ToString();
errorinfo = "异常信息: " + exceptionContext.Exception.Message;
errorsource = "错误源:" + exceptionContext.Exception.Source;
errortrace = "堆栈信息:" + exceptionContext.Exception.StackTrace;
//独占方式,因为文件只能由一个进程写入.
System.IO.StreamWriter writer = null;
try
{
lock (this)
{
// 写入日志
string year = DateTime.Now.Year.ToString();
string month = DateTime.Now.Month.ToString();
string path = string.Empty;
string filename = DateTime.Now.Day.ToString() + ".log";
path = exceptionContext.RequestContext.HttpContext.Server.MapPath("~/ErrorLogs/") + year + "/" + month;
//如果目录不存在则创建
if (!System.IO.Directory.Exists(path))
{
System.IO.Directory.CreateDirectory(path);
}
System.IO.FileInfo file = new System.IO.FileInfo(path + "/" + filename);
writer = new System.IO.StreamWriter(file.FullName, true);//文件不存在就创建,true表示追加
writer.WriteLine("用户IP:" + exceptionContext.RequestContext.HttpContext.Request.UserHostAddress);
writer.WriteLine(errortime);
writer.WriteLine(erroraddr);
writer.WriteLine(errorinfo);
writer.WriteLine(errorsource);
writer.WriteLine(errortrace);
writer.WriteLine("--------------------------------------------------------------------------------------");
}
}
finally
{
if (writer != null)
writer.Close();
}
}
}