Log Entity Framework .Net Core 2.2 EF для отладки выходного окна - PullRequest
3 голосов
/ 22 мая 2019

Используя Entity Framework в .Net Core 2.2, я хотел бы зарегистрировать все операторы SQL, сгенерированные EF, в окне «Отладочный вывод» в Visual Studio.

В .Net Framework мне просто нужно было добавить эту строку в конструктор DbContext:

Database.Log = s => System.Diagnostics.Debug.WriteLine(s);

В EF я пробую следующее. Он компилируется, и метод OnConfiguring вызывается, но вызовы базы данных не регистрируются в моем окне вывода отладки. Чего мне не хватает?

public class MyContext : DbContext
{
    private ILoggerFactory GetLoggerFactory()
    {
        IServiceCollection serviceCollection = new ServiceCollection();
        serviceCollection.AddLogging(builder => builder
            .AddDebug()
            .AddFilter(DbLoggerCategory.Database.Command.Name, LogLevel.Debug));
        return serviceCollection.BuildServiceProvider()
                .GetService<ILoggerFactory>();
    }

    public MyContext(DbContextOptions<MembershipContext> options) : base(options)
    {
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseLoggerFactory(GetLoggerFactory());
    }
}

Мой appsettings.json содержит это:

  "Logging": {
"LogLevel": {
  "Default": "Debug"
}

},

И мой Startup.cs содержит эту строку в методе ConfigureServices:

services.AddDbContext<MyContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("MyConnectionSTring")));

Startup.cs также содержит это в каждом из приведенных ниже ответов, но это не приводит к тому, что EF SQL выводится в окно вывода:

    public ILogger<Startup> Logger { get; set; }

    public Startup(IConfiguration configuration, ILogger<Startup> logger)
    {
        Configuration = configuration;
        Logger = logger;

        //the following line gets printed to my debug output window:
        logger.LogDebug("this is a debug message");
    }

Ответы [ 4 ]

2 голосов
/ 22 мая 2019

вам также нужно добавить интерфейс ILogger в Startup.cs

     public Startup(IConfiguration configuration, ILogger<Startup> logger, IHostingEnvironment hostingEnvironment)
        {   
            Configuration = configuration;
            Logger = logger;
            HostingEnvironment = hostingEnvironment;
        }

        public ILogger<Startup> Logger { get; }

Я использую Serilog, и он прекрасно работает со следующими опциями в настройках приложения

    "Serilog": {
    "MinimumLevel": {
      "Default": "Debug"
    }
1 голос
/ 22 мая 2019

Вы можете попробовать это, если это поможет.Спасибо

 public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .ConfigureLogging(logger => {
                logger.AddDebug()
                      .AddFilter(DbLoggerCategory.Database.Command.Name, LogLevel.Information);
                //logger.AddConsole(); //UnComment out this line if you did not use CreateDefaultBuilder
            });

enter image description here

0 голосов
/ 22 мая 2019

Вы можете запустить это в коде Visual Studio, и он будет отображать запросы SQL.VSCode бесплатный.Вы можете скачать его здесь: Нажмите здесь

0 голосов
/ 22 мая 2019

Спасибо за комментарии и ответы.Проблема здесь была между моими ушами.Код, который я первоначально разместил в моем вопросе, работает;он записывает необработанный SQL в окно вывода отладки для запросов Entity SQL.

На самом деле, гораздо меньше требуется, если приложение использует ядро ​​asp.net (что делает это приложение веб-API).По умолчанию Visual Studio 2017 вставляет следующий бит кода в Program.cs как часть шаблона проекта:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)  
            .UseStartup<Startup>();

При вызове CreateDefaultBuilder добавляются 3 типа ведения журнала - Console, Debug, EventSource - итакже извлекает раздел «Ведение журнала» из appsettings.json.Материал «LoggerFactory» в моем исходном вопросе является избыточным и не нужен.

Код, с которым я тестировал и с которым не работал, в то время как он использовал контекст базы данных, выполнял хранимую процедуру с использованием System.Data.Common.DbCommand, который не передает информацию регистратору, подключенному к DbContext.Мне нужно вручную регистрировать SQL-операторы System.Data.Common.DbCommand (это также необходимо в .Net Framework, но прошло столько лет с тех пор, как я коснулся этого, что я забыл).

КогдаЯ создал DbSet в своем DbContext и сделал выбор против него, используя Entity SQL, например:

var log = _myContext.Log.FirstOrDefault(o => o.Id > 0);

, это успешно записывает необработанный SQL в мое окно вывода отладки, например:

Microsoft.EntityFrameworkCore.Database.Command:Information: 
Executed DbCommand (6ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT TOP(1) [o].[Id], [o].[Browser], [o].[Client], [o].[Date], [o].[Exception], 
[o].[Host], [o].[Level], [o].[Logger], [o].[Message], [o].[StackTrace], [o].[Thread], 
[o].[User]
FROM [Log] AS [o]
WHERE [o].[Id] > 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...