O 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.
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
- Visual Studio 2022 (.NET 6.0)
- Nuget package Serilog.AspNetCore, Serilog.Enrichers.CorrelationId, Serilog.Exceptions e Serilog.Sinks.Async
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
[…] 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 […]
[…] testar os agendamentos, execute a API e analise os logs gerados pelo Serilog no console da […]
[…] Os detalhes completos deste exemplo você encontra no meu GitHub: https://github.com/hgmauri/serilog-best-practices e neste post. […]
[…] Mais informações sobre a configuração do Serilog você encontra aqui. […]