• EF Core如何输出日志到Visual Studio的输出窗口


    我们在使用EF Core的时候,很多时候需要在Visual Studio的输出窗口中知道EF Core在后台生成的SQL语句是什么,这个需求可以通过自定义EF Core的ILoggerFactory和ILogger类来实现:

    首先定义一个实现了ILogger接口的类EFLogger,主要目的是将EF Core生成的Log信息输出到Visual Studio的输出窗口:

    using Microsoft.Extensions.Logging;
    using System;
    using System.Diagnostics;
    
    namespace WebCore.Utils
    {
        public class EFLogger : ILogger
        {
            protected string categoryName;
    
            public EFLogger(string categoryName)
            {
                this.categoryName = categoryName;
            }
    
            public IDisposable BeginScope<TState>(TState state)
            {
                return null;
            }
    
            public bool IsEnabled(LogLevel logLevel)
            {
                return true;
            }
    
            public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
            {
                //通过Debugger.Log方法来将EF Core生成的Log信息输出到Visual Studio的输出窗口
                Debugger.Log(0, categoryName, "=============================== EF Core log started ===============================
    ");
                Debugger.Log(0, categoryName, formatter(state,exception)+"
    ");
                Debugger.Log(0, categoryName, "=============================== EF Core log finished ===============================
    ");
            }
        }
    }

    然后定义一个实现了ILoggerFactory接口的类EFLoggerFactory,用于创建上面定义的EFLogger类的实例:

    using Microsoft.Extensions.Logging;
    
    namespace WebCore.Utils
    {
        public class EFLoggerFactory : ILoggerFactory
        {
            public void AddProvider(ILoggerProvider provider)
            {
            }
    
            public ILogger CreateLogger(string categoryName)
            {
                return new EFLogger(categoryName);//创建EFLogger类的实例
            }
    
            public void Dispose()
            {
    
            }
        }
    }

    最后在DbContext的OnConfiguring方法中,调用optionsBuilder.UseLoggerFactory来将EFLoggerFactory类的实例注入给EF Core,这样所有DbContext的Log信息,都会由EFLogger类输出到Visual Studio的输出窗口了。

    using System;
    using Microsoft.EntityFrameworkCore;
    using Microsoft.EntityFrameworkCore.Metadata;
    using WebCore.Utils;
    
    namespace WebCore.Entities
    {
        public partial class TestDBContext : DbContext
        {
            public TestDBContext()
            {
                this.Database.SetCommandTimeout(0);//设置SqlCommand永不超时
            }
    
            public TestDBContext(DbContextOptions<TestDBContext> options)
                : base(options)
            {
            }
    
            public virtual DbSet<Person> Person { get; set; }
    
            protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            {
                if (!optionsBuilder.IsConfigured)
                {
                    optionsBuilder.UseLoggerFactory(new EFLoggerFactory());//将EFLoggerFactory类的实例注入给EF Core,这样所有DbContext的Log信息,都会由EFLogger类输出到Visual Studio的输出窗口了
                    optionsBuilder.UseSqlServer("Server=localhost;User Id=sa;Password=1qaz!QAZ;Database=TestDB");
                }
            }
            
            protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                //省略代码...
            }
        }
    }
            

    注意OnConfiguring这个方法是virtual的,所以我们也可以选择在DbContext的子类中来重写这个方法,在子类的OnConfiguring中注入EFLoggerFactory类的实例到DbContext。

    最后我们来看看EF Core日志输出的效果,还是很规整的,最重要的是我们可以实时的得到EF Core在后台生成的SQL语句:

  • 相关阅读:
    [HNOI2004]宠物收养所 题解
    文艺平衡树(区间翻转)(Splay模板)
    搜索专题 题解
    Gorgeous Sequence 题解 (小清新线段树)
    花神游历各国 题解(小清新线段树/树状数组+并查集)
    [HNOI2012]永无乡 题解
    poj 3683 2-sat问题,输出任意一组可行解
    hdu 1824 2-sat问题(判断)
    hdu 4115 石头剪子布(2-sat问题)
    hdu 4421 和poj3678类似二级制操作(2-sat问题)
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/9769455.html
Copyright © 2020-2023  润新知