soundie
@soundie
Преподаватель, программист, писатель

Как лучше присоединить Serilog к .NET 6?

Мне нужно использовать Serilog вместо дефолтного логгера (ILogger) в приложении ASP.NET (шаблон Worker Service) в среде .NET 6. Нашел в интернете два подхода.

Первый:

using Serilog;

IHost host = Host.CreateDefaultBuilder(args)
.ConfigureLogging((context, loggingBuilder) =>
{
	loggingBuilder.ClearProviders();

	var Logger = new LoggerConfiguration()
		.WriteTo.Console()
		.CreateLogger();

	loggingBuilder.AddSerilog(Logger);
})
.ConfigureServices(services => 
{ 
   services.AddHostedService<Worker>(); 
})
.Build();

await host.RunAsync();


Второй:
using Serilog;

try
{
    IHost host = Host.CreateDefaultBuilder(args)
    .UseSerilog((ctx, lc) => lc
        .WriteTo.Console()
        .ReadFrom.Configuration(ctx.Configuration))
    .ConfigureServices(services => 
    {
        services.AddHostedService<Worker>(); 
    })
    .Build();

    await host.RunAsync();
}
catch (Exception ex)
{
    Log.Fatal(ex, "Unhandled exception");
}
finally
{
    Log.Information("Shut down complete");
    Log.CloseAndFlush();
}


Вопрос: какое по фэншую корректнее, эффективнее для приложения, которое работает месяцами 24/7 не закрываясь? Почему этот момент может иметь отношение к логгеру - GC по умолчанию отключён в такого вида приложениях и Log.CloseAndFlush() наверное будет полезнее при закрытии, чем без него? Или можно в первый вариант добавить куда-то CloseAndFlush (куда тогда?)? При первом подходе сами по себе (и это хорошо) отображаются сообщения о события вида "Hosting starting", "Hosting stopped" и т.д. То есть вроде бы он корректнее работает. А во втором приходится ещё и менять параметры стандартного логгера (ILogger) в appsettings.json.
  • Вопрос задан
  • 684 просмотра
Решения вопроса 1
- GC по умолчанию отключён в такого вида приложениях

Как у тебя память в таком приложении не заканчивается?
Log.CloseAndFlush()

Это нужно из-за того, что некоторые реализации Sink-ов могут накапливать сообщения перед отправкой.

В целом первый вариант мне нравится больше (сами так делаем)

А во втором приходится ещё и менять параметры стандартного логгера (ILogger) в appsettings.json.

Это из-за того что у тебя там ReadFrom.Configuration

PS: вообще тут у тебя несколько ортогональных вещей:
1. Использовать логгер извне HostBuilder, если сам HostBuilder свалится. (try-catch из второго примера)
2. Конфигурация только из кода (1) или конфигурация из appsettings (2)
3. UseSerilog (2) против ConfigureLogging (1)

Емнип, UseSerilog под капотом вызывает ConfigureLogging, так что выбор остаётся только по первым двум пунктам.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы