Coletando logs com o Serilog no .NET 6

Serilog é uma biblioteca para realização de logging, que fornece os registros para arquivos, console e vários outros lugares. É de fácil configuração e com uma interface limpa e simples de utilizar.

O Serilog tem uma seleção imbatível de destinos de saída (chamados de Sinks) e com uma capacidade de enriquecer, rotear, filtrar e formatar eventos de log estruturados, o que o torna indispensável em qualquer aplicação.

Serilog in ASP.NET Core

Neste artigo, aprenderemos como configurar e utilizar o Serilog no .NET 6.0, seguindo as boas práticas para manter o código limpo e performático.

Pré-requisitos

API

Na classe program.cs da API, configure conforme o código abaixo:

É uma boa prática configurar o Serilog logo no inicio da aplicação e incluir o tratamento de erros (try e catch) para coletar e exibir qualquer exception que a aplicação possa gerar.

O código builder.Host.UseSerilog(Log.Logger) é responsável por registrar o Serilog como provedor padrão da aplicação, com isso é possível também utilizar a interface ILogger para registrar os logs da aplicação.

A extensão AddSerilogApi() contém o seguinte código:

Onde temos as seguintes descrições:

  • MinimumLevel.Override: Configura o registro mínimo de log do namespace informado.
  • Enrich.FromLogContext: Contexto principal de trabalho do Serilog. É preciso registrar esse trecho em praticamente todos os casos, para obter os benefícios do provedor de log.
  • Enrich.WithExceptionDetails: Em caso de erro, coleta e registra todos os detalhes da exception.
  • Enrich.WithCorrelationId: Faz a correlação entre todos os registros de log, para facilitar o trace.
  • Enrich.WithProperty: Inclui uma nova propriedade customizada no log.
  • Filter.ByExcluding: Exclui o log coletado de acordo com o Matching configurado.
  • WriteTo.Async: Realiza todas as operações de forma assíncrona (background). Essa é uma das configurações mais importante do Serilog.

Em app.UseMiddleware<ErrorHandlingMiddleware>() temos o seguinte código:

Este middleware é utilizado como tratamento global de erros, conforme mencionado neste artigo.

Já o trecho app.UseMiddleware<RequestSerilLogMiddleware>() contém o seguinte código:

Este middleware é utilizado para coletar informações adicionais para enriquecer o log, neste caso estamos coletando apenas informação do usuário credenciado.

E finalmente configure o controller com o código abaixo:

Neste exemplo temos o registro de logs de duas formas, uma utilizando o ILogger e outra com a classe estática do Serilog chamada de Log.

Testando

Para realizar os testes, execute o endpoint GET /client no Swagger e verifique o resultado da coleta de logs, incluindo as duas formas configuradas no controller, conforma imagem abaixo:

Finalizando

O Serilog é um componente fantástico e indispensável em todas suas aplicações .NET, com ele é possível capturar todos os logs da aplicação para uma análise futura de telemetria para tomada de decisão. Com a configuração WriteTo.Async tudo é registrado de forma assíncrona, o que garante que o Serilog não impacta na performance da sua aplicação.

Sugiro fortemente a leitura do livro I Heart Logs para entender melhor a importância dos logs no seu desenvolvimento e negócio.

Os detalhes completos deste exemplo você encontra no meu GitHub: https://github.com/hgmauri/sample-serilog

3 comentários

  1. […] e o acesso ao Seq através do método WriteTo.Seq(url, apiKey, controlLevelSwitch). Veja neste artigo como configurar o Serilog em suas aplicações […]

  2. […] testar os agendamentos, execute a API e analise os logs gerados pelo Serilog no console da […]

  3. […] Os detalhes completos deste exemplo você encontra no meu GitHub: https://github.com/hgmauri/serilog-best-practices e neste post. […]

Deixe uma resposta