کنترل و ثبت خطاهای سایت در Asp.net
کنترل و ثبت خطاهای سایت در Asp.net
در این پست به صورت کامل نحوه کنترل خطاها و ثبت خطاهای سایت در Asp.Net را توضیح می دهیم.
برای این کار وارد پوشه App_Data شوید در صورتی که این پوشه را نداشتید با کلیک راست روی پروژه خود و سپس Add و از گزینه Add ASP.NET Folder پوشه App_Data را به پروژه خود اضافه کنید.
حال داخل پوشه App_Data یک پوشه به نام Logs ایجاد کنید و سپس فایلی به نام Application.log داخل این پوشه ایجاد کنید.
در صورت نداشتن فایل Global.asax آن را به پروژه خود اضافه کنید. در این فایل می توانید تنظیمات زیادی انجام دهید.
یکی از متدهای Global.asax به نام Application_Error است. این متد زمانی اجرا می شود که خطای در سایت اتفاق افتاده باشد.
کدهای زیر را داخل این متد کپی کنید.
void Application_Error(object sender, EventArgs e) { // Code that runs when an unhandled error occurs if ((Server != null) && (Server.GetLastError() != null) && (Server.GetLastError().GetBaseException() != null)) { System.Exception ex = Server.GetLastError().GetBaseException(); string strErrorMessage = string.Format("ErrorGlobal:{0}\r\n DataTime:{1}\r\n Path:{2},\r\n User IP:{3}", ex.Message + "HelpLink = " + ex.HelpLink + "Message = " + ex.Message + "Source = " + ex.Source + "StackTrace = " + ex.StackTrace + "TargetSite = " + ex.TargetSite, DateTime.Now, Request.PhysicalPath, Request.UserHostAddress); System.IO.StreamWriter oStreamWriter = null; try { //مسیر فایل لاگ string strApllicationPath ="~/App_Data/Logs/Application.log"; string strAppllicationPathName = Server.MapPath((strApllicationPath)); oStreamWriter = new System.IO.StreamWriter(strAppllicationPathName, true, System.Text.Encoding.UTF8); oStreamWriter.WriteLine((strErrorMessage)); } catch { } finally { if (oStreamWriter != null) { oStreamWriter.Dispose(); oStreamWriter = null; } } } }
در کدهای بالا زمانی که خطا در سایت اتفاق می افتد خطا را به صورت کامل مانند IP کاربر ، صفحه ای که خطا اتفاق افتاده ، تاریخ و ساعت خطا و همچنین متن کامل خطا را در فایل Application.log ذخیره می کنیم.
نکته:
با این روش می توانید داخل کدهای برنامه که از try/catch استفاده کردید در قسمت catch نیز خطا ها را ثبت کنبد.
try { } catch (Exception ex) { string strErrorMessage = string.Format("ErrorGlobal:{0}\r\n DataTime:{1}\r\n Path:{2},\r\n User IP:{3}", ex.Message + "HelpLink = " + ex.HelpLink + "Message = " + ex.Message + "Source = " + ex.Source + "StackTrace = " + ex.StackTrace + "TargetSite = " + ex.TargetSite, DateTime.Now, Request.PhysicalPath, Request.UserHostAddress); System.IO.StreamWriter oStreamWriter = null; try { //مسیر فایل لاگ string strApllicationPath = "~/App_Data/Logs/Application.log"; string strAppllicationPathName = Server.MapPath((strApllicationPath)); oStreamWriter = new System.IO.StreamWriter(strAppllicationPathName, true, System.Text.Encoding.UTF8); oStreamWriter.WriteLine((strErrorMessage)); } catch { } finally { if (oStreamWriter != null) { oStreamWriter.Dispose(); oStreamWriter = null; } } }
در کدهای بالا در قسمت try ما چیزی ننوشتم در این قسمت کدهای که احتمال بروز خطا دارد نوشته می شود مانند هنگام اتصال به دیتابیس و در قسمت catch خطای اتفاق افتاده را ثبت می کنیم.
ایجاد صفحات نمایش خطاها
برای نمایش پیفام مناسب برای کاربر برای هر خطا صفحه ای ایجاد می کنیم.
یک پوشه به نام Errors ایجاد کنید و چهار صفحه به صورت زیر ایجاد کنید.
ErrorGeneral.aspx : صفحه نمایش خطاهای عمومی
Error403.aspx : صفحه نمایش خطاهای دسترسی بدون مجوز
Error404.aspx : صفحه نمایش خطاهای صفحه مورد نظر پیدا نشد
Error500.aspx : صفحه نمایش خطاهای سروری
حال به فایل web.config بروید و به صورت زیر مسیر صفحات را مشخص کنید.
<?xml version="1.0"?> <!-- For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <system.web> <compilation debug="true" targetFramework="4.5.1" /> <httpRuntime targetFramework="4.5.1" /> <!--<customErrors mode="Off"></customErrors>--> <customErrors mode="On" defaultRedirect="~/Errors/ErrorGeneral.aspx" > <error statusCode="403" redirect="~/Errors/Error403.aspx"/> <error statusCode="404" redirect="~/Errors/Error404.aspx"/> <error statusCode="500" redirect="~/Errors/Error500.aspx"/> </customErrors> </system.web> </configuration>
در کدهای بالا در صورت که می خواهید هنگام طراحی سایت خطا ها را مشاهده کنید کد زیر را فعال کنید و کدهای بعدی را غیر فعال کنید.
<?xml version="1.0"?> <!-- For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <system.web> <compilation debug="true" targetFramework="4.5.1" /> <httpRuntime targetFramework="4.5.1" /> <customErrors mode="Off"></customErrors> <!--<customErrors mode="On" defaultRedirect="~/Errors/ErrorGeneral.aspx" > <error statusCode="403" redirect="~/Errors/Error403.aspx"/> <error statusCode="404" redirect="~/Errors/Error404.aspx"/> <error statusCode="500" redirect="~/Errors/Error500.aspx"/> </customErrors>--> </system.web> </configuration>
نکته مهم:
توصیه می شود هنگام انتشار نهایی برنامه mode را به RemoteOnly تغییر دهید
نظر / سوال