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:
EF Core - Iniciando com o Entity Framework Core
Core - Usando o EF Core com Windows Forms ...
ASP .NET Core - Acessando dados com Entity ...
EF Core - Conceitos Básicos - Macoratti
EF Core - Usando a abordagem DataBase First ..
EF Core 2.0 - Scaffolding DbContext e Models ...
Curso Entity Framework Core 2.0 - Vídeo Aulas