Что такое Серилог?
Serilog — это популярная библиотека ведения журналов для приложений .NET. Он разработан, чтобы обеспечить гибкую и эффективную структуру ведения журналов с упором на структурированное ведение журналов. Serilog позволяет разработчикам фиксировать события журнала и сохранять их в различных форматах и местах назначения, таких как файлы, базы данных и внешние службы.
Одной из ключевых особенностей Serilog является поддержка структурированного ведения журналов. Вместо того, чтобы регистрировать сообщения в виде простого текста, Serilog рекомендует разработчикам регистрировать структурированные данные в виде пар ключ-значение. Этот структурированный подход позволяет лучше анализировать и фильтровать данные журналов, упрощая поиск, запросы и анализ журналов во время отладки и устранения неполадок.
Serilog предоставляет простой в использовании API, который поддерживает различные уровни журналов, такие как информация, предупреждение, ошибка и отладка. Разработчики могут использовать эти уровни журнала для классификации событий журнала в зависимости от их серьезности или важности. Serilog также поддерживает различные приемники журналов, которые отвечают за запись событий журнала в разные места назначения. Некоторые популярные приемники включают в себя приемники файлов, приемники консолей, приемники баз данных и приемники для внешних служб журналов, таких как Elasticsearch, Seq и Splunk.
В дополнение к своей основной функциональности Serilog предлагает богатую экосистему расширений и интеграций, позволяющую разработчикам расширять свои возможности и интегрироваться с другими инструментами и платформами. Serilog стал популярным выбором для ведения журнала в приложениях .NET благодаря своей простоте, гибкости и мощным функциям для структурированного ведения журнала.
Вот пример настройки Serilog в приложении .NET Core 6 с использованием файла JSON для настройки:
- Установите необходимые пакеты:
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 в качестве приемника для отправки событий журнала по электронной почте:
- Установите необходимый пакет:
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
в конфигурации.