Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
При работе с приложением на стороне администратора важно своевременно отловить возможные ошибки и исключения, которые могут возникнуть. И для этого мы можем логгировать ошибки в базу данных. Для логгирования ошибок проще всего использовать фильтр исключений.
Итак, создадим новый проект, пусть он называется ExceptionLoggerApp. И определим модель, которая будет представлять информацию об исключении:
public class ExceptionDetail { public int Id { get; set; } public string ExceptionMessage { get; set; } // сообщение об исключении public string ControllerName { get; set; } // контроллер, где возникло исключение public string ActionName { get; set; } // действие, где возникло исключение public string StackTrace { get; set; } // стек исключения public DateTime Date { get; set; } // дата и время исключения }
Также добавим в проект Entity Framework и определим контекст данных:
public class LoggerContext : DbContext { public LoggerContext() : base("DefaultConnection") { } public DbSet<ExceptionDetail> ExceptionDetails { get; set; } }
Далее определим в проекте папку Filters и добавим в нее новый фильтр исключений:
using ExceptionLoggerApp.Models; using System; using System.Web.Mvc; namespace ExceptionLoggerApp.Filters { public class ExceptionLoggerAttribute : FilterAttribute, IExceptionFilter { public void OnException(ExceptionContext filterContext) { ExceptionDetail exceptionDetail = new ExceptionDetail() { ExceptionMessage = filterContext.Exception.Message, StackTrace = filterContext.Exception.StackTrace, ControllerName = filterContext.RouteData.Values["controller"].ToString(), ActionName = filterContext.RouteData.Values["action"].ToString(), Date = DateTime.Now }; using(LoggerContext db = new LoggerContext()) { db.ExceptionDetails.Add(exceptionDetail); db.SaveChanges(); } filterContext.ExceptionHandled = true; } } }
С помощью переданного в метод OnException()
объекта ExceptionContext получаем всю необходимую информацию об исключении,
формируем объект ExceptionDetail и сохраняем его в базу данных.
Далее применим данный фильтр, эмулируя исключения в контроллере:
public class HomeController : Controller { LoggerContext db = new LoggerContext(); public ActionResult Index() { return View(db.ExceptionDetails.ToList()); } [ExceptionLogger] public ActionResult Test(int id) { if(id > 3) { int[] mas = new int[2]; mas[6] = 4; } else if(id < 3) { throw new Exception("id не может быть меньше 3"); } else { throw new Exception("Некорректное значение для параметра id"); } return View(); } }
В методе Test последовательно генерируются исключения.
После генерации исключений все они будут записаны в базу данных, и мы сможем их оттуда извлечь: