Как включить ведение журнала в EF Core 3?

Я использую Entity Framework Core 3 Preview 5 и ASP.NET Core 3 Preview 5. В моем окне вывода отладки Visual Studio 2019 я не получаю журналы от EF Core. Я прочитал документацию, но после этого я еще больше запутался:

  1. Согласно https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.dbcontextoptionsbuilder.useloggerfactory?view=efcore-2.1 ведение журнала должно быть настроено автоматически:

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.

Хотя это не мой опыт.

  1. Я попытался включить ведение журнала, внедрив ILoggerFactory в ConfigureServices (я намеревался передать его DbContextOptionsBuilder.UseLoggerFactory, но это больше невозможно, см. https://github.com/aspnet/Announcements/issues/353

Итак, как настроить ведение журнала для выходных окон отладки в EF Core 3.0? Спасибо!

Интересует закрытое голосование. Не могли бы вы объяснить это и предоставить решение, спасибо.

stefan.at.wpf 18.06.2019 13:19

Вы взглянули на это, пожалуйста: docs.microsoft.com/en-us/ef/core/miscellaneous/logging

TanvirArjel 18.06.2019 16:24

Причина закрытых голосов заключается в том, что вы не публикуете любой код, который может воспроизвести проблему. Насколько всем известно, возможно, вы вообще не включили ведение журнала или записывали только информационные сообщения. Есть вопросы как этот, которые спрашивают, как отключить ведение журнала. Конфигурация ведения журнала по умолчанию записывает в консоль, вывод отладки и журнал событий.

Panagiotis Kanavos 18.06.2019 16:31

Хорошо я понял. Я тем временем тоже нашел причину: критическое изменение в EF Core 3.0. Запросы SQL теперь отображаются только в режиме отладки. Я должен был проверить больше, был ли выход из ядра EF вообще. Я шел не в том направлении. Упомянутое критическое изменение: docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/…, см. также stackoverflow.com/questions/55997906/….

stefan.at.wpf 18.06.2019 17:13

Следует отметить, что это изменение будет отменено снова: github.com/aspnet/EntityFrameworkCore/issues/14523

stefan.at.wpf 18.06.2019 17:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
15
5
15 609
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Обновление для 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 18.06.2019 17:39

@stefan.at.wpf правильная ссылка для этого github.com/aspnet/EntityFrameworkCore/issues/15888

Panagiotis Kanavos 18.06.2019 17:41

Есть еще одна важная причина, по которой ведение журнала может не происходить: этот комментарий к 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>();

Wouter 15.11.2020 01:33

Не знаю, как ответить на такой невнятный комментарий.

Granger 19.11.2020 22:44

Я пытался получить фабрику регистраторов из опций, но она всегда была нулевой. Как оказалось, это на самом деле не нужно, и тогда комментарий действительно имеет смысл.

Wouter 20.11.2020 22:14

Другие вопросы по теме