Como usar o Serilog no aplicativo .NET Core Console

8

Queria que meu aplicativo tivesse capacidade de registrar em um arquivo, então comecei a procurar algo mais do que a estrutura de log padrão do .NET Core 2.2. Vejo que Serilog pode fazer o trabalho. No entanto, não consigo encontrar nenhum documento sobre como configurar o Serilog no aplicativo .NET Core Console com Injeção de Dependência. Tudo o que vejo são materiais do ASP.NET, o que provavelmente não é o que eu preciso.

Comecei a fazer isso sozinho. Eu instalei (Nuget):

  • Serilog
  • Serilog.Extensions.Logging
  • Serilog.Sinks.File
  • Serilog.Sinks.Console (para usar o Serilog em todos os meus logs)

Eu criei uma extensão paraServiceCollection

        public static void AddLogging(this IServiceCollection services, Microsoft.Extensions.Logging.LogLevel logLevel)
        {
            var serilogLogger = new LoggerConfiguration()
            .WriteTo.Console()
            .WriteTo.File("log.txt")
            .CreateLogger();

            services.AddLogging(builder =>
            {
                builder.SetMinimumLevel(logLevel);
                builder.AddSerilog(logger: serilogLogger, dispose: true);
            });
        }

O registro funciona, no entanto:

  • nível de log não é o que eu defini. Parece que o serilog está usando o nível INFO, embora eu quisesse ter DEBUG. Por que minha configuração não é respeitada? Afinal, ainda estou usando a estrutura de log do NET Core, então estou usando-a para configurar o nível de log
  • estou realmente fazendo esta instalação corretamente? Não tenho muita certeza se disposedeveria ser true. Geralmente, quero que a estrutura de injeção de dependência do NET Core cuide da disposição dos serviços.
Loreno
fonte

Respostas:

3

Não tenho certeza builder.SetMinimumLevel(ele não usa o enil Serilog).

Definimos o nível do criador de logs ao criar o LoggerConfigurationobjeto.

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Debug) // restricted... is Optional
    (...)
    .CreateLogger();

Entre. Vale ressaltar a seção a seguir, noções básicas de configuração

Mínimo entre registrador e coletor - é importante perceber que o nível de registro só pode ser aumentado para pias, e não para baixo. Portanto, se o MinimumLevel do criador de logs estiver definido como Information, um coletor com Debug como seu nível especificado ainda verá apenas os eventos no nível Information. Isso ocorre porque a configuração no nível do criador de logs controla quais instruções de criação de log resultarão na criação de eventos, enquanto a configuração no nível do coletor as filtra apenas. Para criar um único criador de logs com um nível mais detalhado, use um LoggerConfiguration separado.


Eu não tenho certeza builder.AddSerilog.

Aqui está o que funciona para mim.

using Serilog;

(...)

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    (...)
    .CreateLogger();

(...)

return new HostBuilder()
      .ConfigureHostConfiguration(...)
      .ConfigureServices(...)
      .UseSerilog();
timtim
fonte
Seu primeiro ponto sobre configuração também é válido no meu caso. O estabelecimento builder.SetMinimumLeveltem prioridade mais alta que o estabelecimento de Serilog. Portanto, posso definir o log Verbose no Serilog e o nível real desejado no log da Microsoft para obter o que eu preciso. Vejo que você está em algum aplicativo hospedado, como o ASP.NET. Provavelmente você está usando o pacote Serilog.AspNetCore. No meu caso, eu não tenho nenhum host.
Loreno