ASP.NET Core: implementando Logs com Serilog + MongoDB
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:
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):
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: