EF Core 5.0 - Simple Loging com LogTo - I

 Neste artigo vou apresentar o novo recurso do EF Core 5 que facilita a realização de logging.

O novo recurso do log simples do Entity Framework Core (EF Core 5) pode ser usado para obter facilmente os logs durante o desenvolvimento e depuração de aplicativos. Esta forma de registro requer configuração mínima
 e nenhum pacote NuGet adicional.

Os logs do EF Core podem ser acessados de qualquer tipo de aplicativo por meio do uso do método LogTo ao configurar uma instância DbContext.

Essa configuração geralmente é feita em uma sobrecarga de DbContext.OnConfiguring. Por exemplo:   

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
      => optionsBuilder.LogTo(Console.WriteLine);

Como alternativa, LogTo pode ser chamado como parte de AddDbContext ou ao criar uma instância DbContextOptions para passar para o construtor DbContext.

Direcionando os logs

Podemos direcionar o resultado da obtenção dos logs para diversas saídas.

1- Logging para o Console

O método LogTo requer um delegado Action<T> que aceita uma string. O EF Core irá chamar este delegado com uma string para cada mensagem de log gerada. Cabe então ao delegado fazer algo com a mensagem dada.

O método Console.WriteLine é freqüentemente usado para este delegado, conforme mostrado abaixo. Isso resulta em cada mensagem de log sendo gravada no console.

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
      => optionsBuilder.LogTo(Console.WriteLine);

2- Logging para janela de Debug

O comando Debug.WriteLine pode ser usado para enviar saída para a janela Debug no Visual Studio ou outros IDEs. A sintaxe Lambda deve ser usada neste caso porque a classe Debug é compilada a partir de compilações de release. Por exemplo:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder.LogTo(message => Debug.WriteLine(message));

3- Logging para um arquivo

Para gravar os logs em um arquivo temos que  criar um StreamWriter ou similar para o arquivo. O método WriteLine pode então ser usado como nos outros exemplos acima.

Devemos garantir que o arquivo seja fechado de forma limpa, descartando o writer quando o contexto for descartado. Por exemplo:

private readonly StreamWriter _logStream = new StreamWriter("meulog.txt", append: true); 

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder.LogTo(_logStream.WriteLine);

public override void Dispose()
{
    base.Dispose();
       _logStream.Dispose();
}

public override async ValueTask DisposeAsync()
{
    await base.DisposeAsync();
    await _logStream.DisposeAsync();
}

Detalhando as mensagens do log

Por padrão, EF Core não incluirá os valores de nenhum dado nas mensagens de exceção. Isso ocorre porque esses dados podem ser confidenciais e podem ser revelados no uso em produção se uma exceção não for tratada.

No entanto, conhecer os valores dos dados, especialmente para as chaves, pode ser muito útil durante a depuração. Isso pode ser habilitado no EF Core chamando EnableSensitiveDataLogging (). Por exemplo:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .LogTo(Console.WriteLine)
        .EnableSensitiveDataLogging();

Detalhando as exceções de consultas

Por motivos de desempenho, EF Core não envolve cada chamada para ler um valor do provedor de banco de dados em um bloco try-catch e assim não permite a exibição de logs detalhados sobre exceções de consultas.

No entanto, isso às vezes resulta em exceções que são difíceis de diagnosticar, especialmente quando o banco de dados retorna NULL quando não permitido pelo modelo.

Para obter exceções detalhadas de consultas podemos ativar  EnableDetailedErrors para que o EF introduza esses blocos try-catch e, assim, forneça erros mais detalhados. Por exemplo:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .LogTo(Console.WriteLine)
        .EnableDetailedErrors();

Na continuação deste artigo veremos um exemplo prático de uso do Simple logging do EF Core 5.0.

"Quem, pois, tiver bens do mundo, e, vendo o seu irmão necessitado, lhe cerrar as suas entranhas, como estará nele o amor de Deus? Meus filhinhos, não amemos de palavra, nem de língua, mas por obra e em verdade."
1 João 3:17,18

Referências:


José Carlos Macoratti