Saat ini saya menggunakan log4net di aplikasi ASP.NET MVC saya untuk mencatat pengecualian. Cara saya melakukan ini adalah dengan membuat semua pengontrol saya mewarisi dari kelas BaseController. Dalam acara OnActionExecuting BaseController, saya mencatat setiap pengecualian yang mungkin terjadi:
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);
}
}
Ini berfungsi dengan baik jika pengecualian yang tidak tertangani terjadi selama tindakan pengontrol.
Adapun kesalahan 404, saya memiliki kesalahan khusus yang diatur di web.config saya seperti ini:
<customErrors mode="On">
<error statusCode="404" redirect="~/page-not-found"/>
</customErrors>
Dan dalam tindakan pengontrol yang menangani url "halaman-tidak-ditemukan", saya mencatat url asli yang diminta:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult PageNotFound()
{
log.Warn("404 page not found - " + Utils.SafeString(Request.QueryString["aspxerrorpath"]));
return View();
}
Dan ini juga berhasil.
Masalah yang saya alami adalah bagaimana mencatat kesalahan yang ada di halaman .aspx itu sendiri. Katakanlah saya mengalami kesalahan kompilasi pada salah satu halaman atau beberapa kode sebaris yang akan memunculkan pengecualian:
<% ThisIsNotAValidFunction(); %>
<% throw new Exception("help!"); %>
Tampaknya atribut HandleError mengubah rute ini dengan benar ke halaman Error.aspx saya di folder Bersama, tetapi jelas tidak tertangkap oleh metode OnActionExecuted BaseController saya. Saya berpikir saya mungkin bisa meletakkan kode logging di halaman Error.aspx itu sendiri, tapi saya tidak yakin bagaimana cara mengambil informasi kesalahan di level itu.