EF Core 5.0 - Simple Loging com LogTo - II

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

Continuando o artigo anterior veremos agora um exemplo prático de utilização do recurso de simple log do EF Core 5.0.

Como exemplo eu vou usar o banco de dados Northwind.mdf e a tabela Customers em um projeto Console do tipo .NET Core no ambiente do .NET 5.0.

Criando e configurando o projeto Console

Crie um projeto Console do tipo .NET Core e a seguir vamos vamos incluir no projeto o pacotes do EF Core.

Para este exemplo vamos precisar incluir apenas o pacote Microsoft.EntityFrameworkCore.SqlServer versão 5.0.1.

Podemos fazer isso usando o comando : dotnet add package Microsoft.EntityFrameworkCore.SqlServe -version 5.0.1

Podemos também fazer isso via menu Tools ..->Manage Nuget Packages for solution e usar a guia Browse informando o nome do pacote.

Como vamos acessar a tabela Customers do banco de dados Northwind vamos criar uma classe Customer no projeto.

Crie uma pasta Models no projeto e nesta pasta crie a classe Customer:

public class Customer
{
        public string CustomerId { get; set; }
        public string CompanyName { get; set; }
        public string ContactName { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string Country { get; set; }
}

A seguir na pasta Models cria a classe de contexto NorthwindContext que vai herdar de DbContext:

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.Extensions.Logging;
using System;
namespace EFCore5_Logging1.Models
{
    public class NorthwindContext : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder
                .UseSqlServer(@"Data Source=-***\sqlexpress;Initial Catalog=Northwind;Integrated Security=True");
        }
        public virtual DbSet<Customer> Customers { get; set; }
    }
}

No arquivo de contexto estamos definindo no método OnConfiguring o provedor para o SQL Server e a string de conexão com o banco de dados Northwind.

A seguir definimos o mapeamento da entidade Customer para tabela Customers usando o DbSet<>.

Agora para exibir o log no console podemos usa método LogTo() conforme mostrado a seguir:

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.Extensions.Logging;
using System;
namespace EFCore5_Logging1.Models
{
    public class NorthwindContext : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
           optionsBuilder
          .LogTo(Console.WriteLine)
          .UseSqlServer(@"Data Source=desktop-\sqlexpress;Initial Catalog=Northwind;Integrated Security=True");
        }
        public virtual DbSet<Customer> Customers { get; set; }
    }
}

Agora podemos testar a exibição do log criando o código abaixo no arquivo Program que realiza uma consulta com base no nome do país informado e lista o código e nome do contato do cliente a partir da tabela Customers:

   class Program
    {
        static void Main(string[] args)
        {
            WriteLine("Informe o Pais :");
            var pais = ReadLine();
            using (var context = new Models.NorthwindContext())
            {
                var customers = context
                               .Customers
                               .Where(c => c.Country == pais)
                               .ToList();
                WriteLine($"Clientes do :{pais} \n");
 
                foreach (var customer in customers)
                    WriteLine($"{customer.CustomerId} - {customer.ContactName}");
            }
            ReadLine();
        }
    }

Nota: Podemos usar o novo recurso do .NET 5.0 chamado Top Level Statements e dispensar o uso da classe Program e o do método Main:

using System.Linq;
using static System.Console;

WriteLine("Informe o Pais :");
var pais = ReadLine();

using (var context = new EFCore5_Logging1.Models.NorthwindContext())
{
     var customers = context
                                 .Customers
                                 .Where(c => c.Country == pais)
                                 .ToList();

WriteLine($"Clientes do :{pais} \n");

foreach (var customer in customers)
     WriteLine($"{customer.CustomerId} - {customer.ContactName}");

}
ReadLine();

Executando o projeto poderemos ver no console o log gerado conforme figura baixo:

Muita informação !!!

Podemos usar várias sobrecargas para personalizar o log, por exemplo, para registrar apenas eventos na categoria de banco de dados e definir opções para formatar a saída.

Para isso vamos alterar a configuração no arquivo NorthwindContext:

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.Extensions.Logging;
using System;
namespace EFCore5_Logging1.Models
{
    public class NorthwindContext : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder
                .LogTo(Console.WriteLine,
                 new[]
                {
                    DbLoggerCategory.Database.Command.Name
                },
                LogLevel.Information, 
                DbContextLoggerOptions.SingleLine | DbContextLoggerOptions.UtcTime)
                .UseSqlServer(@"Data Source=desktop-bhp8771\sqlexpress;Initial Catalog=Northwind;Integrated Security=True");
        }
        public virtual DbSet<Customer> Customers { get; set; }
    }
}

Agora ao executar o projeto teremos o seguinte resultado:

Lembrando que o EF Core 5.0 é uma biblioteca do .NET Standard 2.1 e não pode ser usado no .NET Framework.

Simples assim...

Pegue o projeto aqui :  EFCore5_Logging1.zip (sem as referências)

Aquele que crê no Filho (Jesus) tem a vida eterna; mas aquele que não crê no Filho não verá a vida, mas a ira de Deus sobre ele permanece.
João 3:36

Referências:


José Carlos Macoratti