Мой ответ адресован ядру EF. Я ссылаюсь на эту проблему github , а документы на настройке DbContext
:
Простой
Переопределяет метод 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
, показанную выше, преимущество в нашей реализации показывает, как мы будем регистрироваться в File (я не вижу поставщика регистрации файлов , поставляемого с EF Core )) Как это:
public class Startup
public void ConfigureServices(IServiceCollection services)
{
...
var lf = new LoggerFactory();
lf.AddProvider(new MyLoggerProvider());
services.AddDbContext(optionsBuilder => optionsBuilder
.UseSqlServer(connection_string)
//Using the LoggerFactory
.UseLoggerFactory(lf));
...
}
}
Вот реализация MyLoggerProvider
(и его MyLogger
, который добавляет свои журналы в файл, который вы можете настроить, ваш EF В файле появятся основные запросы.)
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(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter)
{
File.AppendAllText(@"C:\temp\log.txt", formatter(state, exception));
Console.WriteLine(formatter(state, exception));
}
public IDisposable BeginScope(TState state)
{
return null;
}
}
}