ASP.NET Core + Dapper + MiniProfiler: logging de instruções SQL sem complicações

Renato Groffe
4 min readNov 22, 2021

--

Embora não conte com o rico conjunto de funcionalidades oferecido por projetos como Entity Framework e NHibernate, a biblioteca Dapper traz ainda assim várias extensões de grande valia em .NET para o trabalho com bases relacionais. São complementos muito úteis em cenários que envolvem consultas complexas (em inúmeros casos com bancos de dados considerados legados), oferecendo uma ótima performance na resolução de tais problemas.

Justamente pelo fato de não se enquadrar como uma solução de mapeamento objeto-relacional (ORM) típica, o Dapper não dispõe de um recurso extremamente útil do Entity Framework Core: a possibilidade de ativar via simples mudança em arquivo de configuração a geração de logs contendo os comandos SQL gerados por diferentes operações. Já discuti inclusive esta capacidade em outro artigo deste blog:

ASP.NET Core + Entity Framework: ativando o logging de instruções SQL

E como poderíamos efetuar o logging de instruções SQL geradas/manipuladas via Dapper durante o desenvolvimento (há que se tomar extremo cuidado em produção, sobretudo com dados sensíveis), de maneira similar ao suporte a logging do Entity Framework Core e sem que isto implique num grande esforço de codificação?

E aproveito este espaço para um convite…

Dia 24/11 (quarta) às 21:00 horário de Brasília — teremos mais um evento online e gratuito no canal Canal .NET.

Será uma live com os MVPs Alexandre Malavasi e Gustavo Bigardi abordando novidades na implementação de Web Apps com Blazor + .NET 6, além de dicas e pacotes úteis para acelerar e descomplicar a criação de projetos com estas tecnologias.

Para participar faça sua inscrição no link a seguir, a transmissão acontecerá via YouTube:

https://bit.ly/live-blazor-dotnet6

A resposta a este questionamento está no projeto MiniProfiler, uma solução open source para instrumentação com inúmeras capacidades para logging e que facilita a coleta de informações das requisições HTTP direcionadas a uma aplicação. As funcionalidades deste pacote constituem uma excelente alternativa para desenvolvimento de sites e APIs RESTs baseados em ASP.NET Core, com os logs gerados podendo incluir até mesmo instruções SQL geradas via ADO.NET puro ou Dapper.

Para configurar o uso do MiniProfiler em um projeto ASP.NET Core basta adicionar o package MiniProfiler.AspNetCore.Mvc (o exemplo demonstrado neste artigo é o de uma API REST criada com .NET 6 + ASP.NET Core e que também utiliza Dapper):

Devemos configurar na sequência o uso do MiniProfiler:

  • Ao acionar o método AddMiniProfiler (linhas 11 e 12) configuramos o endpoint (/profiler) a partir do qual podemos visualizar informações de instrumentação geradas via MiniProfiler;
  • Invocando o método UseMiniProfiler (linha 22) estamos habilitando o middleware que ativará a coleta de métricas e outras informações, incluindo a geração de logs com instruções SQL da interação com bancos de dados.

Ao trabalhar com Dapper geralmente faremos uso de implementações da interface IDbConnection (namespace System.Data), como SqlConnection (namespace Microsoft.Data.SqlClient). Precisaremos então associar uma conexão baseada em uma tecnologia de banco de dados específica a uma instância do tipo ProfiledDbConnection (namespace StackExchange.Profiling.Data), estrutura essa preparada para registrar como log instruções SQL produzidas por nossas aplicações.

É o que demonstra a implementação do tipo RegioesRepository, com o uso de ProfiledDbConnection (linhas 27 e 28) para execuções da aplicação em um ambiente de desenvolvimento:

Uma instância de RegioesRepository será utilizada durante o tratamento de requisições HTTP pela classe RegioesController:

Ao acessar a rota /profiler/results-index serão retornadas as diferentes requisições recebidas (considerando o tempo em que a aplicação esteja ativa):

A rota /profiler/results trará detalhes da última operação logada (incluindo a instrução SQL de consulta executada):

Podemos ainda acessar a partir de /profiler/results-index detalhes de requisições específicas, como indicado na imagem a seguir em que o comando SQL gerado foi destacado em vermelho (rota /profiler/results?id={Guid Profiler}):

O código-fonte desse projeto está no GitHub:

https://github.com/renatogroffe/ASPNETCore6_Dapper-SqlServer-MiniProfiler_RegioesEstados

Criei e disponibilizei também no GitHub um projeto similar ao exemplo aqui apresentado, fazendo uso para isto do .NET 5:

https://github.com/renatogroffe/ASPNETCore5_Dapper-SqlServer-MiniProfiler_RegioesEstados

--

--

Renato Groffe

Microsoft Most Valuable Professional (MVP), Multi-Plataform Technical Audience Contributor (MTAC), Software Engineer, Technical Writer and Speaker