Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Microsoft.Extensions.Logging é um mecanismo de log extensível com provedores de plug-in para muitos sistemas de log comuns. Ambos os 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 Entity Framework Core (EF Core) integra-se totalmente ao Microsoft.Extensions.Logging. No entanto, considere o uso de log simples para uma maneira mais simples de registrar, especialmente para aplicativos que não usam injeção de dependência.
ASP.NET Aplicações principais
Microsoft.Extensions.Logging é usado por padrão em aplicativos ASP.NET Core. Chamar AddDbContext ou AddDbContextPool faz com que o EF Core utilize automaticamente a configuração de logging definida através do mecanismo regular do ASP.NET.
Outros tipos de aplicação
Outros tipos de aplicativos podem usar o GenericHost para obter os mesmos padrões de injeção de dependência usados no ASP.NET Core. AddDbContext ou AddDbContextPool pode ser usado como em aplicativos ASP.NET Core.
Microsoft.Extensions.Logging também pode ser usado para aplicativos que não usam injeção de dependência, embora o registro em log simples possa ser 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 do logger como uma propriedade estática no DbContext.
public static readonly ILoggerFactory MyLoggerFactory
= LoggerFactory.Create(builder => { builder.AddConsole(); });
Essa instância singleton/global deve então ser registada no EF Core com o DbContextOptionsBuilder. Por exemplo:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseLoggerFactory(MyLoggerFactory)
.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFLogging;Trusted_Connection=True;ConnectRetryCount=0");
Receber mensagens detalhadas
Sugestão
OnConfiguring ainda é chamado quando AddDbContext é usado ou uma instância DbContextOptions é passada para o construtor DbContext. Isso o torna o local ideal para aplicar a configuração de contexto, independentemente de como o DbContext é construído.
Dados confidenciais
Por padrão, o EF Core não incluirá os valores de nenhum dado em mensagens de exceção. Isso acontece porque tais dados podem ser confidenciais e podem ser revelados durante o 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 ao depurar. Isso pode ser ativado 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 ler 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, portanto, forneça erros mais detalhados. Por exemplo:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.EnableDetailedErrors();
Configuração para mensagens específicas
A API 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 registo do evento
- Lançar uma exceção quando o evento ocorre
Alterando o nível de log de 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 registo de um evento
Da mesma forma, um evento individual pode ser suprimido do registro. Isto é particularmente útil para ignorar um aviso que foi revisto e compreendido. Por exemplo:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.ConfigureWarnings(b => b.Ignore(CoreEventId.DetachedLazyLoadingWarning));
Lançar para um evento
Finalmente, o EF Core pode ser configurado para lançar para um determinado evento. Isso é particularmente útil para transformar um aviso em um erro. (Na verdade, este era o propósito 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 outras configurações
Consulte Registrando no .NET para obter orientação sobre filtragem de log 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 relacional
- Uma classe semelhante para eventos específicos do 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 pelo Microsoft.Extensions.Logging.