Registro em log e rastreamento no .NET

O código pode ser instrumentado para produzir um log, que serve como registro de eventos interessantes que ocorreram durante a execução do programa. Para entender o comportamento do aplicativo, basta analisar os logs. O .NET acumulou várias APIs de registro em log diferentes ao longo de seu histórico e este artigo ajudará você a entender quais opções estão disponíveis.

Observação

Às vezes, o registro também é chamado de 'rastreamento', inclusive em algumas das APIs mais antigas do Windows e do .NET. Nos últimos anos, 'rastreamento' é mais comumente usado como uma abreviação de rastreamento distribuído, mas esse não é o significado neste artigo.

APIs de registro em log do .NET

ILogger

Na maioria dos casos, seja para a adição de registro em log a um projeto existente ou para a criação de um projeto, a infraestruturaILogger é uma boa opção padrão. ILogger suporta registro estruturado rápido, configuração flexível e uma coleção de coletores comuns incluindo o console, que é o que você vê ao executar um aplicativo ASP.NET. Além disso, a interface ILogger também pode servir como uma fachada em várias implementações de log de terceiros que oferecem funcionalidade e extensibilidade avançadas.

O ILogger fornece a história de log para a implementação do OpenTelemetry para .NET, que permite a saída de logs do seu aplicativo para uma variedade de sistemas de APM, permitindo a análise posterior.

EventSource

EventSource é uma API mais antiga e de alto desempenho com registro estruturado. Ele foi originalmente projetado para integrar-se bem ao ETW (Rastreamento de Eventos para Windows), mas posteriormente foi estendido para dar suporte ao rastreamento entre plataformas do EventPipe e ao EventListener para coletores personalizados. Em comparação com ILogger, EventSource tem relativamente poucos coletores de registros pré-fabricados e não há suporte integrado para configuração por meio de arquivos de configuração separados. EventSource é excelente se você quiser um controle mais rígido sobre a integração com o ETW ou com o EventPipe, mas para registro em log de uso geral, ILogger é mais flexível e fácil de usar.

Trace

System.Diagnostics.Trace e System.Diagnostics.Debug são as APIs de registro em log mais antigas do .NET. Essas classes têm APIs de configuração flexíveis e um grande ecossistema de coletores, mas suporta apenas registros não estruturados. No .NET Framework elas podem ser configuradas por meio de um arquivo app.config, mas no .NET Core, não há nenhum mecanismo de configuração interno baseado em arquivo. Normalmente, eles são usados para produzir a saída de diagnóstico para o desenvolvedor durante a execução no depurador. A equipe do .NET continua a dar suporte a essas APIs para fins de compatibilidade com versões anteriores, mas nenhuma nova funcionalidade será adicionada. Essas APIs são uma boa opção para aplicativos que já as utilizam. Para aplicativos mais recentes que ainda não se comprometeram com uma API de registro em log, ILogger pode oferecer funcionalidades melhores.

APIs de registro em log especializadas

Console

A classe System.Console tem os métodos Write e WriteLine que podem ser usados em cenários simples de registro em log. É muito fácil começar a usar essas APIs, mas a solução não fica tão flexível quanto se utilizasse uma API de registro em log de uso geral. O console permite apenas o registro não estruturado e não há suporte para configuração a fim de selecionar quais mensagens de log são habilitadas ou redirecionar para outro coletor. O uso das APIs ILogger ou Trace com um coletor de console não requer muito mais esforços e mantém o registro em log configurável.

DiagnosticSource

System.Diagnostics.DiagnosticSource destina-se ao registro em log no qual as mensagens de log serão analisadas de modo síncrono em processo, em vez de serializadas para qualquer armazenamento. Isso permite que a origem e o ouvinte troquem objetos .NET arbitrários como mensagens, enquanto a maioria das APIs de registro em log exige que o evento de log seja serializável. Essa técnica também pode ser extremamente rápida, tratando eventos de log em dezenas de nanossegundos se o ouvinte for implementado com eficiência. As ferramentas que usam essas APIs geralmente agem mais como criadores de perfil no processo, embora a API não imponha nenhuma restrição aqui.

EventLog

System.Diagnostics.EventLog é uma API somente do Windows que grava mensagens no Windows EventLog. Em muitos casos, usar o ILogger com um coletor opcional do EventLog em execução no Windows pode oferecer funcionalidades semelhantes, sem acoplar fortemente o aplicativo ao sistema operacional Windows.

Terminologia de registro

Registros estruturados e não estruturados

O registro pode ser estruturado ou não estruturado:

  • Não estruturado: as entradas de log são codificadas como texto de formato livre que os humanos podem ler, mas é difícil analisar e consultar programaticamente.
  • Estruturadas: as entradas de log têm um esquema bem definido e podem ser codificadas em diferentes formatos binários ou textuais. Esses logs foram projetados para serem traduzidos e consultados por computador, permitindo que tanto humanos quanto sistemas automatizados trabalhem com eles com facilidade.

Boas APIs de log estruturadas podem oferecer mais funcionalidade e desempenho com apenas um pequeno aumento na complexidade do uso.

Coletores

A maioria das APIs de registro em log permite que as mensagens de log sejam enviadas para diferentes destinos chamados de coletores. Algumas APIs têm muitos coletores predefinidos, ao passo que outras têm apenas alguns. Se não houver nenhum coletor predefinido, geralmente existirá uma API de extensibilidade que permitirá criar um coletor personalizado, embora isso exija escrever um pouco mais de código.