ASP.NET Core: implementando Logs com Serilog + MongoDB

Renato Groffe
3 min readJun 22, 2020

--

Alternativa extremamente popular entre Desenvolvedores .NET, o Serilog é uma solução open source para logging que se destaca por sua flexibilidade e a facilidade de integração com as mais variadas tecnologias. Logs podem ser direcionados para arquivos, o console, bases de dados relacionais ou NoSQL…

Tais integrações são viabilizadas por bibliotecas geralmente disponibilizadas via NuGet e conhecidas como Sinks. Temos atualmente Sinks para tecnologias como SQL Server, MongoDB, PostgreSQL, Elasticsearch, dentre outras opções listadas em:

Provided Sinks - Serilog

Neste novo artigo demonstrarei como configurar o Serilog em uma aplicação ASP.NET Core 3.1, com a gravação dos logs em uma coleção do MongoDB. A opção por esta tecnologia NoSQL se deu graças à sua flexibilidade (orientada a documentos + schemaless) e boa performance.

E aproveito este espaço para um convite… Que tal participar do próximo treinamento online promovido pelo Azure na Prática e que acontecerá durante o dia 29/08/2020 (sábado), tendo como foco Serverless + Azure Functions e que engloba ainda o uso de tecnologias como .NET, Azure Logic Apps, RabbitMQ, Apache Kafka, SQL Server, MongoDB, Redis, Application Insights, Azure Cosmos DB e GitHub Actions? Acesse então o link a seguir para efetuar sua inscrição com o desconto especial de pré-venda (apenas R$ 200,00):

https://bit.ly/anp-serverless3-blog-groffe-pre

Implementando logging com Serilog + MongoDB

Para habilitar o uso de Serilog com MongoDB em uma aplicação ASP.NET Core serão adicionados os packages:

  • Serilog.AspNetCore
  • Serilog.Sinks.MongoDB

A string de conexão com o MongoDB foi incluída no arquivo appsettings.json; esta configuração deverá referenciar o banco de dados do MongoDB em que constará a coleção com os logs. No exemplo a seguir foi utilizado o nome Serilog para o banco, com o mesmo indicado logo após a / (barra) que sucede a porta da instância do MongoDB:

Será necessário alterar a implementação do tipo Program:

  • O tipo estático Log no namespace Serilog conta com a propriedade Logger e métodos como Information para o envio de mensagens de log a um destino (banco de dados, console, arquivo…);
  • Precisaremos vincular o uso desta classe Log à interface ILogger do ASP.NET Core. Acionar para isto o método UseSerilog em CreateHostBuilder;
  • Ao invocar o método ConfigureAppConfiguration em CreateHostBuilder ocorrerá a configuração da propriedade Logger do tipo Log, de maneira que a mesma direcione os dados de log para uma coleção chamada LogAPIContagem (parâmetro collectionName) na base do MongoDB.

Nos demais pontos da aplicação utilizaremos instâncias de ILogger (tipo este que integra a infraestrutura básica do ASP.NET Core), com a obtenção de tais referências ocorrendo via injeção de dependências. A implementação da classe ContadorController exemplifica bem essa questão, com chamadas ao método LogInformation resultando na gravação de registros de log no MongoDB:

Exemplos envolvendo o log gerado na linha 28 desta última listagem estão destacados na imagem a seguir (notam-se inúmeros detalhes gravados para estes logs, valendo-se das vantagens oferecidos por uma tecnologia de banco de dados schemaless):

O código-fonte deste exemplo já está no disponível no GitHub:

ASP.NET Core 3.1 + REST API + Serilog + MongoDB

--

--

Renato Groffe
Renato Groffe

Written by Renato Groffe

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