Глобальная обработка исключений в ASP.NET 5

Как я могу присоединить свою собственную логику ведения журнала к приложению ASP.NET 5 для обработки каждого исключения, созданного в бизнес-логике и более низких уровнях?

Я попытался с собственной реализацией ILoggerProvider и loggerfactory.AddProvider(new LoggerProvider(Configuration)) в Startup.cs. Но кажется, что он перехватывает внутренний материал ASP.NET, а не мои брошенные исключения в нижних слоях.

Ответы

Ответ 1

Разработал это, используя два варианта:

1) ILoggerProvider Внедрите свой собственный ILoggerProvider и ILogger из пространства имен Microsoft.Framework.Logging Затем присоедините его к MVC Framework в Startup.cs, добавьте следующий код:

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerfactory)
 {
        loggerfactory.AddProvider(new YourCustomProvider());
 }

Но этот вышеприведенный параметр, по-видимому, вызывает функцию Write для ILogger в определенных событиях MVC, связанную маршрутизацию и т.д., он не вызывался, когда я выбрасывал исключения на своих нижних уровнях, поэтому был выработан второй вариант:

2) Глобальный фильтр Зарегистрируйте свою собственную реализацию ActionFilterAttribute в Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().Configure<MvcOptions>(options =>
    {
        options.Filters.Add(new YourCustomFilter());
    });
}

Важно, чтобы пользовательский класс фильтра реализовал IExceptionFilter interace:

  public class YourCustomFilter : ActionFilterAttribute, IExceptionFilter
  {
             public void OnException(ExceptionContext context)
             {
              ///logic...
             }
 }

(РЕДАКТИРОВАТЬ:) А затем в классе Startup добавим фильтр:

    public void ConfigureServices(IServiceCollection services)
    {
         services.AddMvc(options =>
            {
                options.Filters.Add(new YourCustomFilter());
            });
    }

Ответ 2

Если вы хотите создать глобальную инфраструктуру исключения исключений, а не только на уровне контроллера, взгляните на один из моих проектов с открытым исходным кодом. Я планирую сделать это в пакет Nuget вскоре после праздников. Я также планирую обновить свой блог, показывая, почему я его разработал.

Проект с открытым исходным кодом находится на github: https://github.com/aspnet-plus/AspNet.Plus.Infrastructure Взгляните на образец для использования.