Мой адрес ответа EF core . Я упоминаю эту проблему github и документы по , конфигурирующие DbContext
:
Simple
Переопределите метод OnConfiguring
вашего DbContext
класса (YourCustomDbContext
) , как показано здесь , чтобы использовать ConsoleLoggerProvider; Ваши запросы должны войти в консоль:
public class YourCustomDbContext : DbContext
{
#region DefineLoggerFactory
public static readonly LoggerFactory MyLoggerFactory
= new LoggerFactory(new[] {new ConsoleLoggerProvider((_, __) => true, true)});
#endregion
#region RegisterLoggerFactory
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseLoggerFactory(MyLoggerFactory); // Warning: Do not create a new ILoggerFactory instance each time
#endregion
}
Complex
В этом сложном случае избегается переопределение метода DbContext
OnConfiguring
. , который не рекомендуется в документах: «Этот подход не подходит для тестирования, если тесты не нацелены на полную базу данных».
Этот сложный случай использует:
- Метод
IServiceCollection
в Startup
класс ConfigureServices
(вместо переопределения метода OnConfiguring
; преимуществом является более слабая связь между DbContext
и ILoggerProvider
, которые вы хотите использовать)
- Реализация
ILoggerProvider
(вместо того, чтобы использовать реализацию ConsoleLoggerProvider
, показанную выше; преимущество заключается в том, что наша реализация показывает, как мы ведем журнал в файл (я не вижу провайдера регистрации файлов, поставляемого с EF Core ))
Вот так:
public class Startup
public void ConfigureServices(IServiceCollection services)
{
...
var lf = new LoggerFactory();
lf.AddProvider(new MyLoggerProvider());
services.AddDbContext<YOUR_DB_CONTEXT>(optionsBuilder => optionsBuilder
.UseSqlServer(connection_string)
//Using the LoggerFactory
.UseLoggerFactory(lf));
...
}
}
Вот реализация MyLoggerProvider
(и его MyLogger
, который добавляет свои журналы в файл, который вы можете настроить; ваши запросы EF Core появятся в файле.)
public class MyLoggerProvider : ILoggerProvider
{
public ILogger CreateLogger(string categoryName)
{
return new MyLogger();
}
public void Dispose()
{ }
private class MyLogger : ILogger
{
public bool IsEnabled(LogLevel logLevel)
{
return true;
}
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
{
File.AppendAllText(@"C:\temp\log.txt", formatter(state, exception));
Console.WriteLine(formatter(state, exception));
}
public IDisposable BeginScope<TState>(TState state)
{
return null;
}
}
}