Şu anda özel durumları günlüğe kaydetmek için ASP.NET MVC uygulamamda log4net kullanıyorum. Bunu yapmamın yolu, tüm denetleyicilerimin BaseController sınıfından miras almasıdır. BaseController'ın OnActionExecuting olayında, meydana gelmiş olabilecek istisnaları günlüğe kaydediyorum:
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);
}
}
Bu, bir denetleyici eylemi sırasında işlenmeyen bir istisna meydana gelirse harika çalışır.
404 hatalarına gelince, web.config dosyamda şu şekilde ayarlanmış özel bir hata var:
<customErrors mode="On">
<error statusCode="404" redirect="~/page-not-found"/>
</customErrors>
Ve "sayfa bulunamadı" url'sini işleyen denetleyici eyleminde, istenen orijinal url'yi günlüğe kaydediyorum:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult PageNotFound()
{
log.Warn("404 page not found - " + Utils.SafeString(Request.QueryString["aspxerrorpath"]));
return View();
}
Ve bu da işe yarıyor.
Karşılaştığım sorun, .aspx sayfalarında bulunan hataları günlüğe nasıl kaydedeceğim. Diyelim ki sayfalardan birinde bir derleme hatası veya bir istisna atacak bazı satır içi kodlar var:
<% ThisIsNotAValidFunction(); %>
<% throw new Exception("help!"); %>
Görünüşe göre HandleError özniteliği bunu Paylaşılan klasördeki Error.aspx sayfama doğru şekilde yeniden yönlendiriyor, ancak kesinlikle BaseController'ın OnActionExecuted yöntemi tarafından yakalanmıyor. Günlük kodunu Error.aspx sayfasına koyabileceğimi düşünüyordum, ancak bu düzeyde hata bilgisini nasıl alacağımdan emin değilim.