Я использую Entity Framework Core 3 Preview 5 и ASP.NET Core 3 Preview 5. В моем окне вывода отладки Visual Studio 2019 я не получаю журналы от EF Core. Я прочитал документацию, но после этого я еще больше запутался:
There is no need to call this method when using one of the 'AddDbContext' methods. 'AddDbContext' will ensure that the ILoggerFactory used by EF is obtained from the application service provider.
Хотя это не мой опыт.
ILoggerFactory в ConfigureServices (я намеревался передать его DbContextOptionsBuilder.UseLoggerFactory, но это больше невозможно, см. https://github.com/aspnet/Announcements/issues/353Итак, как настроить ведение журнала для выходных окон отладки в EF Core 3.0? Спасибо!
Вы взглянули на это, пожалуйста: docs.microsoft.com/en-us/ef/core/miscellaneous/logging
Причина закрытых голосов заключается в том, что вы не публикуете любой код, который может воспроизвести проблему. Насколько всем известно, возможно, вы вообще не включили ведение журнала или записывали только информационные сообщения. Есть вопросы как этот, которые спрашивают, как отключить ведение журнала. Конфигурация ведения журнала по умолчанию записывает в консоль, вывод отладки и журнал событий.
Хорошо я понял. Я тем временем тоже нашел причину: критическое изменение в EF Core 3.0. Запросы SQL теперь отображаются только в режиме отладки. Я должен был проверить больше, был ли выход из ядра EF вообще. Я шел не в том направлении. Упомянутое критическое изменение: docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/…, см. также stackoverflow.com/questions/55997906/….
Следует отметить, что это изменение будет отменено снова: github.com/aspnet/EntityFrameworkCore/issues/14523





Обновление для 3.0 RTM и более поздних версий: Уровень журнала вернулся к информации. Проверьте фильтрация того, что регистрируется в документах для получения более подробной информации.
Закрытые голоса, вероятно, связаны с тем, что в вопросе нет кода, который может воспроизвести проблему.
В любом случае EF Core ведет журнал на уровне отладки. Уровень по умолчанию, используемый универсальным компоновщиком хостов или компоновщиком веб-хостов, — Information. Уровень логирования нужно изменить на Trace или Debug.
По умолчанию этот код не регистрирует никаких событий EF:
static async Task Main(string[] args)
{
var host = Host
.CreateDefaultBuilder(args)
.ConfigureServices((context, services) =>
{
var configuration = context.Configuration;
services.AddDbContext<MyContext>(options =>
options.UseSqlServer(configuration.GetConnectionString("someConnection")));
})
.Build();
using(var ctx=host.Services.GetRequiredService<MyContext>())
{
var cnt=await ctx.Customers.CountAsync();
Console.WriteLine(cnt);
}
}
Он будет регистрировать только это событие:
info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
Entity Framework Core 3.0.0-preview6.19304.10 initialized 'ConsolidatorsContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
Чтобы регистрировать события EF, нам нужно изменить уровень ведения журнала для событий EF Core на Trace или Debug через appsettings.json или код. Например, включив это в appsettings.json :
"Logging": {
"LogLevel": {
"Microsoft.EntityFrameworkCore":"Debug"
}
},
Будет регистрировать события EF:
dbug: Microsoft.EntityFrameworkCore.Infrastructure[10401]
An 'IServiceProvider' was created for internal use by Entity Framework.
info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
Entity Framework Core 3.0.0-preview6.19304.10 initialized 'MyContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
dbug: Microsoft.EntityFrameworkCore.Database.Connection[20000]
Opening connection to database 'Customers' on server '10.0.0.216'.
dbug: Microsoft.EntityFrameworkCore.Database.Connection[20001]
Opened connection to database 'Customers' on server '10.0.0.216'.
dbug: Microsoft.EntityFrameworkCore.Database.Command[20100]
Executing DbCommand [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT COUNT(*)
FROM [Customers] AS [c]
dbug: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (42ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT COUNT(*)
FROM [Customers] AS [c]
4
dbug: Microsoft.EntityFrameworkCore.Database.Command[20300]
A data reader was disposed.
dbug: Microsoft.EntityFrameworkCore.Database.Connection[20002]
Closing connection to database 'Customers' on server '10.0.0.216'.
dbug: Microsoft.EntityFrameworkCore.Database.Connection[20003]
Closed connection to database 'Customers' on server '10.0.0.216'.
dbug: Microsoft.EntityFrameworkCore.Infrastructure[10407]
'MyContext' disposed.
Спасибо! Кажется, мы отвечали параллельно, см. мои комментарии выше. Обратите внимание, что требуемый уровень ведения журнала будет снова изменен на Информация в будущем выпуске: github.com/aspnet/EntityFrameworkCore/issues/14523.
@stefan.at.wpf правильная ссылка для этого github.com/aspnet/EntityFrameworkCore/issues/15888
Есть еще одна важная причина, по которой ведение журнала может не происходить: этот комментарий к AddDbContext() имеет неупомянутую зависимость.
There is no need to call this method when using one of the 'AddDbContext' methods. 'AddDbContext' will ensure that the ILoggerFactory used by EF is obtained from the application service provider.
Это работает, только если ваш DbContext внедряет DbContextOptions<T> в конструктор base.
Например. автоматически сгенерированный конструктор из Scaffold-DbContext
public MyDbContext(DbContextOptions<MyDbContext> options)
: base(options)
{
}
Этот введенный объект был настроен с помощью LoggerFactory, поэтому, если вы не сделаете это так, вам придется вручную установить регистратор в методе OnConfiguring().
Это по-прежнему не работает с использованием AddDbContext<MyDbContext>();
Не знаю, как ответить на такой невнятный комментарий.
Я пытался получить фабрику регистраторов из опций, но она всегда была нулевой. Как оказалось, это на самом деле не нужно, и тогда комментарий действительно имеет смысл.
Интересует закрытое голосование. Не могли бы вы объяснить это и предоставить решение, спасибо.