Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O Microsoft.Extensions.Logging é um mecanismo extensível de registro em log com provedores de plug-in para muitos sistemas de log comuns. Plug-ins fornecidos pela Microsoft (por exemplo , Microsoft.Extensions.Logging.Console) e plug-ins de terceiros (por exemplo , Serilog.Extensions.Logging) estão disponíveis como pacotes NuGet.
O EF Core (Entity Framework Core) integra-se totalmente com Microsoft.Extensions.Logging. No entanto, considere usar o logging simples para uma forma mais simples de fazer log, especialmente para aplicativos que não usam injeção de dependência.
Aplicativos do ASP.NET Core
Microsoft.Extensions.Logging é usado por padrão em aplicativos ASP.NET Core. Chamar AddDbContext ou AddDbContextPool faz com que o EF Core use automaticamente a configuração de registro configurada por meio do mecanismo de ASP.NET regular.
Outros tipos de aplicativo
Outros tipos de aplicativo podem usar o GenericHost para obter os mesmos padrões de injeção de dependência usados no ASP.NET Core. AddDbContext ou AddDbContextPool , em seguida, pode ser usado da mesma forma que em aplicativos do ASP.NET Core.
Microsoft.Extensions.Logging também pode ser usado para aplicações que não utilizam injeção de dependência, embora um log simples seja mais fácil de configurar.
Microsoft.Extensions.Logging requer a criação de um LoggerFactory. Essa fábrica deve ser armazenada como uma instância estática/global em algum lugar e usada sempre que um DbContext é criado. Por exemplo, é comum armazenar a fábrica de registradores como uma propriedade estática no DbContext.
public static readonly ILoggerFactory MyLoggerFactory
= LoggerFactory.Create(builder => { builder.AddConsole(); });
Essa instância singleton/global deve ser registrada no DbContextOptionsBuilder com o EF Core. Por exemplo:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseLoggerFactory(MyLoggerFactory)
.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFLogging;Trusted_Connection=True;ConnectRetryCount=0");
Obtendo mensagens detalhadas
Dica
OnConfiguring ainda é chamado quando AddDbContext é usado ou uma instância de DbContextOptions é passada para o construtor de DbContext. Isso torna o local ideal para aplicar a configuração de contexto, independentemente de como o DbContext é construído.
Dados sensíveis
Por padrão, o EF Core não incluirá os valores de nenhum dado em mensagens de exceção. Isso ocorre porque esses dados podem ser confidenciais e podem ser revelados no ambiente de produção se exceções não forem tratadas.
No entanto, conhecer valores de dados, especialmente para 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.EnableSensitiveDataLogging();
Exceções de consulta detalhadas
Por motivos de desempenho, o EF Core não encapsula cada chamada para leitura de um valor do provedor de banco de dados em um bloco try-catch. No entanto, isso às vezes resulta em exceções difíceis de diagnosticar, especialmente quando o banco de dados retorna um NULL quando não é permitido pelo modelo.
Ativar EnableDetailedErrors fará com que o EF introduza esses blocos try-catch e, assim, forneça erros mais detalhados. Por exemplo:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.EnableDetailedErrors();
Configuração para mensagens específicas
A API do EF Core ConfigureWarnings permite que os aplicativos alterem o que acontece quando um evento específico é encontrado. Isso pode ser usado para:
- Alterar o nível de log no qual o evento é registrado
- Ignorar completamente o registro do evento
- Gerar uma exceção quando o evento ocorrer
Alterando o nível de log para um evento
Às vezes, pode ser útil alterar o nível de log predefinido para um evento. Por exemplo, isso pode ser usado para promover dois eventos adicionais de LogLevel.Debug para LogLevel.Information.
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.ConfigureWarnings(
b => b.Log(
(RelationalEventId.ConnectionOpened, LogLevel.Information),
(RelationalEventId.ConnectionClosed, LogLevel.Information)));
Suprimir o registro em log de um evento
Da mesma forma, um evento individual pode ser suprimido do registro em log. Isso é particularmente útil para ignorar um aviso que foi revisado e compreendido. Por exemplo:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.ConfigureWarnings(b => b.Ignore(CoreEventId.DetachedLazyLoadingWarning));
Desencadear um evento
Por fim, o EF Core pode ser configurado para gerar para um determinado evento. Isso é particularmente útil para alterar um aviso em um erro. (Na verdade, essa era a finalidade original do ConfigureWarnings método, daí o nome.) Por exemplo:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.ConfigureWarnings(b => b.Throw(RelationalEventId.QueryPossibleUnintendedUseOfEqualsWarning));
Filtragem e outra configuração
Veja Logging no .NET para obter diretrizes sobre filtragem de logs e outras configurações.
Os eventos de log do EF Core são definidos em um dos seguintes:
- CoreEventId para eventos comuns a todos os provedores de banco de dados EF Core
- RelationalEventId para eventos comuns a todos os provedores de banco de dados relacionais
- Uma classe semelhante para eventos específicos ao provedor de banco de dados atual. Por exemplo, SqlServerEventId para o provedor do SQL Server.
Essas definições contêm as IDs de evento, o nível de log e a categoria para cada evento, conforme usado por Microsoft.Extensions.Logging.