Logging em C# (.NET): Visão geral das melhores soluções
Logging não é apenas registrar erros. É uma ferramenta fundamental para monitorar o estado da aplicação, auditar ações de usuários e depurar em ambiente de produção. No ecossistema C# (.NET), existem várias bibliotecas maduras, cada uma resolvendo a tarefa de logging de sua própria maneira. Neste artigo, analisaremos as soluções mais populares: NLog, Serilog, log4net e o embutido Microsoft.Extensions.Logging.
1. Microsoft.Extensions.Logging (ILogger embutido)
A partir do .NET Core, a Microsoft fornece uma abstração para logging — a interface ILogger<T> e a fábrica ILoggerFactory. Não é uma biblioteca completa, mas um contrato ao qual qualquer implementação (NLog, Serilog, etc.) pode ser conectada.
Prós: embutido no ASP.NET Core, não requer dependências adicionais para logging básico, facilmente substituível por outra biblioteca.
Contras: funcionalidade limitada "de fábrica" (apenas níveis: Trace, Debug, Information, Warning, Error, Critical). Não há dados estruturados.
Exemplo de uso:
using Microsoft.Extensions.Logging;
public class OrderService{ private readonly ILogger<OrderService> _logger;
public OrderService(ILogger<OrderService> logger) { _logger = logger; }
public void ProcessOrder(int orderId) { _logger.LogInformation("Processando pedido {OrderId}", orderId); try { // Lógica de processamento } catch (Exception ex) { _logger.LogError(ex, "Erro ao processar pedido {OrderId}", orderId); } }}2. Serilog (Logging estruturado)
Serilog é líder em flexibilidade e popularidade. Sua principal característica é o logging estruturado. Em vez de mensagens de string, você passa objetos que são automaticamente serializados em JSON ou outro formato. Isso permite analisar logs facilmente através de Elasticsearch, Seq ou Grafana.
Prós: excelente integração com .NET, "enrichers" poderosos (enriquecimento com contexto), suporte a sinks (saída para arquivo, BD, console, serviços em nuvem).
Contras: para aplicações simples pode ser excessivo, requer configuração.
Exemplo de configuração e uso:
using Serilog;
// Configuração em Program.csLog.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.Console() .WriteTo.File("logs/myapp-.log", rollingInterval: RollingInterval.Day) .WriteTo.Seq("http://localhost:5341") .Enrich.WithProperty("Application", "MyApp") .CreateLogger();
try{ Log.Information("Iniciando aplicação"); var user = new { Id = 1, Name = "João" }; Log.Information("Usuário {User} fez login no sistema", user);}catch (Exception ex){ Log.Fatal(ex, "Erro crítico");}finally{ Log.CloseAndFlush();}3. NLog (Desempenho e flexibilidade)
NLog é outro framework poderoso com uma rica história. É conhecido por seu desempenho e suporte a regras complexas de roteamento. A configuração pode ser definida tanto em arquivo XML (nlog.config) quanto programaticamente.
Prós: muito rápido, suporta logging assíncrono, pode enviar logs por email, para bancos de dados, para EventLog. Excelente suporte para .NET Framework e .NET Core.
Contras: a sintaxe de configuração XML pode parecer pesada.
Exemplo de configuração nlog.config:
<?xml version="1.0" encoding="utf-8" ?><nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <targets>