Как использовать расширенные функции Serilog в ASP.NET Core MVC

автор vadim


Одной из замечательных особенностей ASP.NET Core является встроенная поддержка ведения журналов. Это означает, что вы можете воспользоваться своей платформой ведения журналов для получения журналов инфраструктуры из вашей инфраструктуры ведения журналов. Хотя это может помочь вам получить более глубокое понимание показателей вашего приложения, у этого есть и свои недостатки. Например, вы часто получаете слишком много журналов, т. е. слишком много сообщений в журналах, которые могут быть бессмысленными.

Serilog — это сторонняя библиотека с открытым исходным кодом, которая прекрасно интегрируется с ASP.NET Core и позволяет разработчикам легко регистрировать структурированные данные о событиях на консоли, в файлах и различных типах целей журнала. Я обсуждал основные функции Serilog в предыдущей статье здесь. В этой статье рассказывается о нескольких расширенных возможностях Serilog, таких как уменьшение детализации журнала и сводки сообщений журнала, а также о том, как их можно реализовать в ASP.NET Core MVC 5.

Для работы с примерами кода, представленными в этой статье, в вашей системе должна быть установлена ​​Visual Studio 2019. Если у вас еще нет копии, вы можете скачать Visual Studio 2019 здесь.

Создайте проект ASP.NET Core MVC в Visual Studio 2019.

Прежде всего давайте создадим проект ASP.NET Core в Visual Studio 2019. Выполнение этих шагов позволит создать новый проект ASP.NET Core MVC 5 в Visual Studio 2019.

  1. Запустите интегрированную среду разработки Visual Studio.
  2. Нажмите «Создать новый проект».
  3. В окне «Создать новый проект» выберите «ASP.NET Core Web App (Model-View-Controller)» из списка отображаемых шаблонов.
  4. Нажмите “Далее.
  5. В окне «Настроить новый проект» укажите имя и местоположение нового проекта.
  6. При желании установите флажок «Поместить решение и проект в один каталог», в зависимости от ваших предпочтений.
  7. Нажмите “Далее.
  8. В следующем окне «Дополнительная информация» выберите .NET 5.0 в качестве целевой платформы из раскрывающегося списка вверху. В поле «Тип аутентификации» оставьте значение «Нет» (по умолчанию).
  9. Убедитесь, что флажки «Включить Docker», «Настроить для HTTPS» и «Включить компиляцию среды выполнения Razor» сняты, поскольку мы не будем здесь использовать ни одну из этих функций.
  10. Нажмите Создать.

Новый проект ASP.NET Core MVC 5 будет создан вместе с классом HomeController по умолчанию. Мы будем использовать этот проект для работы с Serilog в последующих разделах этой статьи.

Установите пакеты Serilog NuGet.

Если вы успешно создали проект ASP.NET Core, следующее, что вам нужно сделать, — это добавить в проект необходимые пакеты NuGet. Для этого выберите проект в окне обозревателя решений, щелкните правой кнопкой мыши и выберите «Управление пакетами NuGet…». В окне диспетчера пакетов NuGet найдите следующие пакеты и установите их.

Серилог.AspNetCore
Серилог.Синкс.Файл

Альтернативно вы можете установить два пакета через консоль диспетчера пакетов NuGet, введя строки, показанные ниже.

PM> Install-Package Serilog.AspNetCore
PM> Install-Package Serilog.Sinks.File

Зарегистрируйте Serilog в ASP.NET Core MVC

Чтобы начать использовать Serilog в приложениях ASP.NET Core, вам необходимо зарегистрировать Serilog в WebHostBuilder в файле Program.cs, используя метод расширения UseSerilog, как показано ниже.

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
    .ConfigureWebHostDefaults(webBuilder => {
        webBuilder.UseStartup < Startup > ();
    }).UseSerilog();

Вот полный исходный код класса Program для справки:

public class Program
    {
        public static void Main(string[] args)
        {
            try
            {
                string outputTemplate = "{Timestamp:yyyy-MM-dd
                 HH:mm:ss.fff} [{Level}] {Message}{NewLine}{Exception}";
                Log.Logger = new
                LoggerConfiguration().WriteTo.File("C:\\Logs\\Demo.txt",
                rollingInterval: RollingInterval.Day, outputTemplate:
                 outputTemplate).CreateLogger();
                CreateHostBuilder(args).Build().Run();               
            }
            catch
            {
                throw;
            }
            finally
            {
                Log.CloseAndFlush();
            }
        }
        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                }).UseSerilog();
    }

Настройка Serilog в ASP.NET Core MVC

Serilog использует приемники для отправки журналов в различные целевые объекты журналов, такие как текстовый файл или база данных. Вам следует написать следующий код в методе Main, чтобы настроить целевой объект журнала и указать интервал прокрутки и ограничение размера файла.

Log.Logger = new LoggerConfiguration()
    .WriteTo.File(Path.Combine("C:\\Logs\\", "Test-Log-{Date}.txt"),
    rollingInterval: RollingInterval.Day, fileSizeLimitBytes: 100000)
    .CreateLogger();

Понимание уровней серьезности событий Serilog

Теперь, когда вы настроили Serilog в своем приложении, вы можете воспользоваться встроенным интерфейсом ILogger для регистрации данных в методах действий вашего контроллера, как показано ниже.

public IActionResult Index()
{
  _logger.LogInformation("Log message generated with INFORMATION severity level.");
  _logger.LogWarning("Log message generated with WARNING severity level.");
  _logger.LogError("Log message generated with ERROR severity level.");
  _logger.LogCritical("Log message log generated with CRITICAL severity level.");
  return View();
}

По умолчанию Serilog регистрирует события уровня серьезности «Информация» и выше. Также доступны два уровня ниже уровня информации — «Отладка» и «Подробный».

Создайте экземпляр средства ведения журнала Serilog в ASP.NET Core MVC.

Следующий фрагмент кода показывает, как экземпляр _logger был создан с помощью внедрения зависимостей в конструктор класса HomeController.

private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
   _logger = logger;
}

Вот полный исходный код класса HomeController для справки:

public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        readonly IDiagnosticContext _diagnosticContext;
        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }
        [CustomSerilogLogging]
        public IActionResult Index()
        {
            _logger.LogInformation("Log message generated with
                INFORMATION severity level.");
            _logger.LogWarning("Log message generated with
                 WARNING severity level.");
            _logger.LogError("Log message generated with
                ERROR severity level.");
            _logger.LogCritical("Log message log generated with
                CRITICAL severity level.");
            return View();
        }
        public IActionResult Privacy()
        {
            return View();
        }
        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None,
            NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId =
                Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }

Если вы запустите приложение, оно по умолчанию автоматически перейдет на домашнюю страницу. Вы заметите, что в папке C:\Logs на вашем компьютере был создан файл журнала со следующим содержимым:

Серилог Aspnet Core MVC 01 ИДГ

Рисунок 1. По умолчанию Serilog регистрирует события уровня серьезности «Информация» и выше.

Обратите внимание на выделенный текст на рисунке 1. Это строки, которые мы записали в журнал в методе действия Index класса HomeController. Также обратите внимание, что регистрация событий, связанных с уровнями серьезности Serilog по умолчанию — «Информация», «Предупреждение», «Ошибка» и «Неустранимая», — может привести к созданию очень подробных журналов. К счастью, мы можем уменьшить детализацию журнала, отключив уровни событий, которые нас не интересуют.

Отключите ненужные события в Serilog

Обновите конфигурацию Serilog, указанную в классе Program, с помощью фильтров, как показано в следующем фрагменте кода.

Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Warning)
.WriteTo.File("C:\\Logs\\Demo.txt",
rollingInterval: RollingInterval.Day,
outputTemplate: outputTemplate).CreateLogger();

Обратите внимание: хотя мы изменили минимальный уровень серьезности событий на «Отладка», мы ограничили ведение журнала уровнем «Информация» и выше для системных событий («Microsoft») и уровнем предупреждения и выше для ASP.NET Core. Когда вы снова запустите приложение, на этот раз файл журнала будет выглядеть следующим образом:

Серилог Aspnet Core MVC 02 ИДГ

Рисунок 2. Фильтрация сообщений журнала в Serilog.

Сообщений в журнале стало меньше, и журнал теперь выглядит намного чище, не так ли?

Используйте промежуточное программное обеспечение для регистрации запросов Serilog в ASP.NET Core MVC.

Доступное как часть пакета Serilog.AspNetCore, промежуточное программное обеспечение для ведения журнала запросов Serilog (т. е. класс RequestLoggingMiddleware) используется для добавления одного сводного сообщения журнала на каждый запрос в вашем приложении. Другими словами, вы можете воспользоваться промежуточным программным обеспечением для регистрации запросов, чтобы получить сводку всех сообщений журнала для каждого запроса в вашем приложении.

Чтобы добавить RequestLoggingMiddleware в конвейер, необходимо вызвать метод UseSerilogRequestLogging(). Этот метод объединяет важную информацию каждого запроса в чистое и краткое событие завершения. Затем, чтобы использовать RequestLoggingMiddleware, все, что вам нужно сделать, это указать следующую строку в методе Configuration класса Startup:

app.UseSerilogRequestLogging();

Теперь, если вы снова запустите наше приложение, вы увидите те же сообщения журнала, но с дополнительным сводным сообщением журнала от Serilog, которое позволит вам узнать время, необходимое для выполнения запроса, как показано на рисунке 3 ниже.

Серилог Aspnet Core MVC 03 ИДГ

Рисунок 3. Промежуточное ПО Serilog RequestLoggingMiddleware в действии!

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

Дальше читайте это:

  • Облачные вычисления больше не являются пустяком
  • Что такое генеративный ИИ? Искусственный интеллект, который создает
  • Программирование с помощью ИИ: советы и лучшие практики от разработчиков
  • Python пытается удалить GIL и повысить параллелизм
  • 7 причин, по которым Java по-прежнему хороша
  • Война за лицензирование открытого исходного кода окончена

Related Posts

Оставить комментарий