ฉันกำลังใช้ log4net ในแอปพลิเคชัน ASP.NET MVC เพื่อบันทึกข้อยกเว้น วิธีที่ฉันทำคือให้คอนโทรลเลอร์ทั้งหมดของฉันสืบทอดมาจากคลาส BaseController ในเหตุการณ์ OnActionExecuting ของ BaseController ฉันบันทึกข้อยกเว้นใด ๆ ที่อาจเกิดขึ้น:
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
// Log any exceptions
ILog log = LogManager.GetLogger(filterContext.Controller.GetType());
if (filterContext.Exception != null)
{
log.Error("Unhandled exception: " + filterContext.Exception.Message +
". Stack trace: " + filterContext.Exception.StackTrace,
filterContext.Exception);
}
}
วิธีนี้ใช้งานได้ดีหากเกิดข้อยกเว้นที่ไม่สามารถจัดการได้ระหว่างการดำเนินการของคอนโทรลเลอร์
สำหรับข้อผิดพลาด 404 ฉันมีข้อผิดพลาดที่กำหนดเองใน web.config ของฉันดังนี้:
<customErrors mode="On">
<error statusCode="404" redirect="~/page-not-found"/>
</customErrors>
และในการดำเนินการของคอนโทรลเลอร์ที่จัดการกับ URL "ไม่พบหน้าเว็บ" ฉันบันทึก URL เดิมที่ถูกร้องขอ:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult PageNotFound()
{
log.Warn("404 page not found - " + Utils.SafeString(Request.QueryString["aspxerrorpath"]));
return View();
}
และยังใช้งานได้
ปัญหาที่ฉันพบคือวิธีบันทึกข้อผิดพลาดที่อยู่บนหน้า. aspx ด้วยตัวเอง สมมติว่าฉันมีข้อผิดพลาดในการคอมไพล์ในหน้าใดหน้าหนึ่งหรือโค้ดอินไลน์บางส่วนที่จะทำให้เกิดข้อยกเว้น:
<% ThisIsNotAValidFunction(); %>
<% throw new Exception("help!"); %>
ดูเหมือนว่าแอ็ตทริบิวต์ HandleError จะเปลี่ยนเส้นทางไปยังเพจ Error.aspx ของฉันในโฟลเดอร์ที่ใช้ร่วมกันอย่างถูกต้อง แต่เมธอด OnActionExecuted ของ BaseController ของฉันไม่ถูกจับ ฉันคิดว่าฉันอาจจะใส่รหัสบันทึกในหน้า Error.aspx ได้ แต่ฉันไม่แน่ใจว่าจะดึงข้อมูลข้อผิดพลาดในระดับนั้นได้อย่างไร