Registrando logs em .NET com Serilog

Registrar logs de forma eficiente é fundamental para monitorar e solucionar problemas em aplicações. O Serilog é uma biblioteca popular no ecossistema .NET, conhecida por sua flexibilidade e suporte a logs estruturados. Com ele, é fácil enriquecer mensagens com contexto adicional e direcionar logs para diversos destinos, como arquivos, console ou sistemas externos. Neste artigo veremos como configurar e usar o Serilog para tornar o registro de logs mais detalhado e simples em seus projetos .NET.

Por que utilizá-lo?

O termo “logs estruturados” refere-se a logs que possuem um formato consistente e detalhado, permitindo análises mais ricas e filtragem avançada. Ao contrário de logs tradicionais em texto simples, logs estruturados são especialmente úteis para monitoramento de aplicações e diagnóstico de problemas, porque permitem enriquecer cada mensagem com propriedades e contexto adicionais. O Serilog é amplamente utilizado devido à sua facilidade de configuração, flexibilidade e ampla gama de sinks para destinos de logs (como arquivos, bancos de dados e serviços externos como Seq).

Configurando o Serilog

Para compreender melhor o funcionamento do Serilog, vamos criar uma aplicação ASP.NET Core simples e integrá-lo para gerenciar o registro de logs. A ideia é configurar o Serilog para registrar primeiramente logs no console e em um arquivo e por fim configurá-lo para registrar logs no banco de dados.

Em sua aplicação ASP.NET Core instale os seguintes pacotes via .NET CLI ou NuGet :

Serilog: A biblioteca principal para registro de logs.

dotnet add package Serilog

Install-Package Serilog

Serilog.AspNetCore: Permite integrar o Serilog ao pipeline de logs do ASP.NET Core.

dotnet add package Serilog.AspNetCore

Install-Package Serilog.AspNetCore

Serilog.Sinks.Console: Para exibir logs no console.

dotnet add package Serilog.Sinks.Console

Install-Package Serilog.Sinks.Console

Serilog.Sinks.File: Para salvar logs em arquivos.

dotnet add package Serilog.Sinks.File

Install-Package Serilog.Sinks.File

Esses pacotes são suficientes para iniciarmos. Conforme a necessidade, você pode adicionar outros sinks específicos, como bancos de dados, que abordaremos adiante.

Com os pacotes instalados, vamos configurar o Serilog para capturar e registrar logs no console e em um arquivo. Abra o arquivo “Program.cs” e configure o Serilog como o gerenciador de logs da aplicação:

				
					using Serilog;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();

Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Console()
.WriteTo.File("logs/actions_log.txt", rollingInterval: RollingInterval.Day)
.Enrich.FromLogContext()
.CreateLogger();

builder.Host.UseSerilog();
var app = builder.Build();

				
			
Através do “LoggerConfiguration”, você pode personalizar como os logs serão registrados na aplicação. Ao atribuir a “Log.Logger”, você está configurando o logger global que será utilizado em toda a aplicação. O “.MinimumLevel.Debug()” define o nível mínimo de logs que o Serilog irá registrar. O nível “Debug“ garante que logs de nível “Debug”, “Information”, “Warning”, “Error” e “Fatal” sejam registrados, ou seja, irá capturar logs de menor severidade até os mais críticos. Você pode alterar de acordo com a sua necessidade. O “.WriteTo.Console()” especifica que os logs devem ser enviados para a saída de console (terminal). Isso é útil durante o desenvolvimento, pois permite que os logs sejam exibidos diretamente na linha de comando enquanto a aplicação está rodando. Já o “.WriteTo.File(“logs/log.txt”, rollingInterval: RollingInterval.Day)” vai definir que os logs também serão registrados em um arquivo chamado “actions_log.txt” dentro da pasta “logs”. A opção “rollingInterval: RollingInterval.Day” indica que, a cada dia, o Serilog criará um novo arquivo de log (com a data no nome) para evitar que o arquivo de log se torne muito grande ao longo do tempo. O resultado será uma pasta com logs diários.

Podemos também adicionar informações adicionais ao log, como propriedades de contexto (ex: informações sobre a requisição HTTP em uma API) utilizando o “.Enrich.FromLogContext()”. Ele permite enriquecer os logs com dados que podem ser importantes para depuração ou rastreamento, como o ID da requisição ou o nome do usuário.

Por fim, o “.CreateLogger()” finaliza a configuração e cria o logger com as opções definidas até esse ponto. Agora, a aplicação pode começar a gerar logs usando o Serilog.

Agora devemos integrar o Serilog ao ciclo de vida do host da aplicação utilizando o “builder.Host.UseSerilog();” que vai permitir que o Serilog seja utilizado para registrar logs durante a execução da aplicação, inclusive capturando logs automaticamente de outras bibliotecas que a aplicação possa utilizar (como ASP.NET Core, por exemplo). Isso substitui o logger padrão do .NET pelo Serilog.

Agora, ao executar o projeto, os logs aparecerão no console e serão salvos no arquivo logs/actions_log.txt.

Tela do console

Arquivo TXT

Alterando o formato dos logs

Ao observarmos o registro de um log, podemos perceber que ele segue uma estrutura padrão definida pelo Serilog. Essa configuração padrão atende à maioria dos casos, mas pode ser personalizada para atender a requisitos específicos utilizando a propriedade “outputTemplate”. Por exemplo, ao configurar o um arquivo de texto como destino de logs, podemos modificar o template para reorganizar o formato que data e hora será apresentado.

Na configuração acima, alteramos o formato da data e hora que segue o padrão ano, mês, dia para dia, mês, ano que é utilizado aqui no Brasil.

Usando o sink do Serilog para SQL Server

Registrar logs em um banco de dados pode ser útil para aplicações que necessitam de persistência de logs a longo prazo, análise avançada ou integração com outras ferramentas de monitoramento. O Serilog permite que você envie logs diretamente para um banco de dados, como o SQL Server, de forma simples e eficiente.

Para começar vamos adicionar o pacote “Serilog.Sinks.MSSqlServer”:

Install-Package Serilog.Sinks.MSSqlServer

ou

dotnet add package Serilog.Sinks.MSSqlServer

Agora, vamos configurar o Serilog para gravar os logs em uma tabela do SQL Server.

				
					var builder = WebApplication.CreateBuilder(args);

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug() 
    .WriteTo.MSSqlServer(
        connectionString: "SuaConnectionString", 
        tableName: "Logs", 
        autoCreateSqlTable: true
    )
    .Enrich.FromLogContext()     
    .CreateLogger();

builder.Host.UseSerilog();

var app = builder.Build();

				
			
Assim como configuramos logs em arquivos e no console, agora os direcionamos para um banco de dados SQL Server com “.WriteTo.MSSqlServer”. Passamos a string de conexão, o nome da tabela (Logs) e ativamos “autoCreateSqlTable: true” para criar a tabela automaticamente, caso não exista. Com isso, os logs serão registrados diretamente no banco, facilitando consultas e análises.

Registrando mensagens com diferentes níveis de Log

Com o Serilog configurado, você pode registrar mensagens com diversos níveis de log diretamente no código.

				
					public class MinhaClasse
{
    private readonly ILogger<MinhaClasse> _logger;

    public MinhaClasse(ILogger<MinhaClasse> logger)
    {
        _logger = logger;
    }

    public void MeuMetodo()
    {
	//Detalhes para desenvolvedores
Log.Debug("Mensagem de depuração."); 

//Informações gerais
Log.Information("A aplicação iniciou com sucesso."); // 

//Alerta
Log.Warning("O uso de memória está acima do esperado."); // 

//Erro
Log.Error("Falha ao conectar ao banco de dados."); 

//Erros fatais
Log.Fatal("Erro crítico! O sistema será finalizado."); 
    }
}

				
			

Esses logs são muito úteis para monitorar o comportamento da aplicação e identificar problemas em diferentes ambientes.

Conclusão

Com o Serilog, você tem várias opções para personalizar o registro de logs e adaptá-lo às necessidades específicas da sua aplicação. A configuração do nível de log, o formato das mensagens e os destinos dos logs (como arquivos, console ou banco de dados) podem ser ajustados conforme o seu caso. Com o tempo, você aprenderá a utilizar diferentes Sinks e recursos do Serilog para otimizar o monitoramento e a depuração da sua aplicação. Para mais detalhes, consulte a documentação oficial do Serilog e explore as opções de Sinks e extensões que atendem melhor às suas necessidades.

Acelere a sua carreira conosco!

Se você é Desenvolvedor .NET Júnior e quer acelerar sua carreira até nível Pleno com salário de R$7k+, ou mesmo busca a primeira vaga, conheça a Mentoria .NET StartClique aqui
Se é Desenvolvedor .NET Pleno ou Sênior e quer virar referência técnica em sua equipe e mercado, com salário de R$10k+, conheça a Mentoria .NET ExpertClique aqui