Возможно, многим знакома библиотека ELMAH (Error Logging Modules and Handlers), которая позволяет организовать простое журналирование ошибок для любого сайта, созданного с помощью .NET Framework.



Этот простой и проверенный временем инструмент выручал меня во многим проектах.
Несколько лет назад, создавая свой новый проект под .NET Core я с досадой обнаружил, что ELMAH не работает под .NET Core.


Но это же opensource проект! Несколько выходных в работе над форком, и вот готова первая версия ELMAH работающая под .NET Core.


С тех пор много воды утекло, и признаюсь, я несколько забросил свой pet-проект. Однако, сейчас выдалась небольшая передышка между проектами, мне удалось внести существенные улучшения и хочу познакомить уважаемых «хабравчан» с новой версией ElmahCore.


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


  • Тип и информация об исключении, стек вызова
  • Информация об HTTP запросе: данные шапки запроса (header), параметры запроса, cookies, данные о подключении пользователя
  • Информация о текущем пользователе
  • Информация о текущей сессии на сервере
  • Переменные среды сервера

В новой версии я добавил регистрацию всех сообщений, созданных через Microsoft.Extensions.Logging (ILogger) в привязке к контексту HTTP запроса.
Вся эта информация может быть сохранена:


  • в памяти сервера
  • в XML файлах в папке на сервере
  • в СУБД, сейчас поддерживаются MSSQL, MySQL, PostgreSQL

Подключение данной библиотеки максимально простое:


  1. Добавить в проект nuget-пакет elmahcore.
  2. Добавить следующие строчки в Startup.cs:

services.AddElmah(); // в метод ConfigureServices 
app.UseElmah(); // в начале метода Configure

Для доступа к журналу ошибок библиотека предоставляет программный и пользовательский интерфейс.
Интерфейс пользователя, по умолчанию, доступен по пути ~/elmah.
В новой версии я существенно переработал UI, реализовав его на VUE.js



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


services.AddElmah(options =>
{
   options.SourcePaths = new []
   {
      @"D:\tmp\ElmahCore.DemoCore3",
      @"D:\tmp\ElmahCore.Mvc",
      @"D:\tmp\ElmahCore"
   };
});

На закладке «Log» отображается журнал сообщений Microsoft.Extensions.Logging в контексте HTTP запроса в котором была зарегистрирована ошибка.



Понятно, что такая ценная информация не для публичных глаз!
Чтобы защитить доступ к журналу, необходимо добавить проверку прав доступа:


services.AddElmah(options =>
{
        options.OnPermissionCheck = context => context.User.Identity.IsAuthenticated;
});

При этом вызов UseElmah, должен быть позже UseAuthentication и UseAuthorization


app.UseAuthentication();
app.UseAuthorization();
app.UseElmah();

Можно организовать фильтрацию регистрируемых ошибок с помощь фильтров, реализованных в коде (реализующих интерфейс IErrorFilter) или в xml-файле конфигурации (https://elmah.github.io/a/error-filtering/examples/).


services.AddElmah<XmlFileErrorLog>(options =>
{
    options.FiltersConfig = "elmah.xml";
    options.Filters.Add(new MyFilter());
})

Кроме регистрации журнала ошибок библиотека позволяет организовать рассылку уведомлений (через реализацию IErrorNotifier), например на электронную почту.


services.AddElmah<XmlFileErrorLog>(options =>
{
    options.Notifiers.Add(new ErrorMailNotifier("Email",emailOptions));
});

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