Логгирование исключений

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 13.04.2016

При работе с приложением на стороне администратора важно своевременно отловить возможные ошибки и исключения, которые могут возникнуть. И для этого мы можем логгировать ошибки в базу данных. Для логгирования ошибок проще всего использовать фильтр исключений.

Итак, создадим новый проект, пусть он называется 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 последовательно генерируются исключения.

После генерации исключений все они будут записаны в базу данных, и мы сможем их оттуда извлечь:

Логгирование исключений в ASP.NET MVC 5
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850