Что такое Серилог?

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

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

Serilog предоставляет простой в использовании API, который поддерживает различные уровни журналов, такие как информация, предупреждение, ошибка и отладка. Разработчики могут использовать эти уровни журнала для классификации событий журнала в зависимости от их серьезности или важности. Serilog также поддерживает различные приемники журналов, которые отвечают за запись событий журнала в разные места назначения. Некоторые популярные приемники включают в себя приемники файлов, приемники консолей, приемники баз данных и приемники для внешних служб журналов, таких как Elasticsearch, Seq и Splunk.

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

Вот пример настройки Serilog в приложении .NET Core 6 с использованием файла JSON для настройки:

  1. Установите необходимые пакеты:
dotnet add package Serilog.AspNetCore
dotnet add package Serilog.Settings.Configuration

2. Создайте файл appsettings.json со следующим содержимым:

{
  "Serilog": {
    "Using": [ "Serilog.Sinks.Console" ],
    "MinimumLevel": "Information",
    "WriteTo": [
      {
        "Name": "Console"
      },
      {
        "Name": "File",
        "Args": {
          "path": "logs/log.txt",
          "rollingInterval": "Day",
          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}"
        }
      }
    ],
    "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ]
  },
  "AllowedHosts": "*"
}

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

3. В файле Program.cs измените метод CreateHostBuilder следующим образом:

using Microsoft.Extensions.Configuration;
using Serilog;

public class Program
{
    public static void Main(string[] args)
    {
        var configuration = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .Build();

        Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(configuration)
            .CreateLogger();

        try
        {
            Log.Information("Starting up");
            CreateHostBuilder(args).Build().Run();
        }
        catch (Exception ex)
        {
            Log.Fatal(ex, "Application startup failed");
        }
        finally
        {
            Log.CloseAndFlush();
        }
    }

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

В приведенном выше коде мы читаем конфигурацию Serilog из файла appsettings.json и создаем экземпляр Logger. Метод UseSerilog() используется для интеграции Serilog с веб-узлом.

4. Наконец, в файле Startup.cs добавьте промежуточное ПО для регистрации запросов Serilog в методе Configure:

using Serilog;
using Serilog.Events;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Hosting;

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // ...

        app.UseSerilogRequestLogging(options =>
        {
            options.GetLevel = (ctx, elapsed, ex) =>
            {
                if (ex != null || ctx.Response.StatusCode > 499)
                    return LogEventLevel.Error;
                if (elapsed > TimeSpan.FromSeconds(3))
                    return LogEventLevel.Warning;
                return LogEventLevel.Information;
            };
        });

        // ...
    }
}

В приведенном выше коде промежуточное ПО для регистрации запросов Serilog добавлено для регистрации информации HTTP-запросов. Функция GetLevel используется для определения уровня журнала на основе контекста HTTP, прошедшего времени и любых исключений.

Вот и все! При наличии этих конфигураций ваше приложение .NET Core 6 будет использовать Serilog для ведения журнала на основе настроек в файле appsettings.json. Не забудьте настроить пути к файлам и другие параметры в соответствии с вашими требованиями.

Вот пример настройки Serilog с SendGrid в качестве приемника для отправки событий журнала по электронной почте:

  1. Установите необходимый пакет:
dotnet add package Serilog.Sinks.SendGrid

2. Настройте ключ API SendGrid и другие параметры в файле appsettings.json:

{
  "Serilog": {
    "Using": ["Serilog.Sinks.SendGrid"],
    "WriteTo": [
      {
        "Name": "SendGrid",
        "Args": {
          "apiKey": "YOUR_SENDGRID_API_KEY",
          "fromEmail": "[email protected]",
          "toEmail": "[email protected]",
          "subject": "Log Event",
          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}"
        }
      }
    ]
  },
  "AllowedHosts": "*"
}

Замените "YOUR_SENDGRID_API_KEY" вашим фактическим ключом API SendGrid. При необходимости задайте адреса электронной почты отправителя и получателя.

3. В файле Program.cs измените метод CreateHostBuilder, включив в него приемник SendGrid:

using Microsoft.Extensions.Configuration;
using Serilog;

public class Program
{
    public static void Main(string[] args)
    {
        var configuration = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .Build();

        Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(configuration)
            .CreateLogger();

        try
        {
            Log.Information("Starting up");
            CreateHostBuilder(args).Build().Run();
        }
        catch (Exception ex)
        {
            Log.Fatal(ex, "Application startup failed");
        }
        finally
        {
            Log.CloseAndFlush();
        }
    }

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

4. Вот и все! Теперь Serilog настроен на отправку событий журнала через SendGrid с использованием предоставленных настроек.

Когда событие регистрируется, Serilog отправит электронное письмо на указанный адрес получателя, используя SendGrid, с подробностями события журнала, отформатированными в соответствии с outputTemplate в конфигурации.