zoukankan      html  css  js  c++  java
  • EF Core如何输出日志到Visual Studio的输出窗口

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

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

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

    using Microsoft.Extensions.Logging;
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Text;
    
    namespace Model
    {
        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)
            {
                if (logLevel != LogLevel.Information)
                {
                    return;
                }
                //通过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 ===============================
    ");
            }
        }
    
        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的输出窗口了。

    特别要注意的是: static readonly EFLoggerFactory loggerFactory = new EFLoggerFactory();  这里一定要用静态类

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            {
                //配置数据库连接地址--测试库
                if (string.IsNullOrWhiteSpace(SomConfig.OMSConfig))
                {
                    string str = System.Environment.CurrentDirectory;
                    FileStream file = new FileStream(str + "\Config.json", FileMode.Open);
                    byte[] byData = new byte[(int)file.Length];//构建一个缓冲池
                    file.Seek(0, SeekOrigin.Begin);
                    file.Read(byData, 0, (int)file.Length);
                    var HaveRead = System.Text.Encoding.UTF8.GetString(byData).Substring(1);
                    var array = JArray.Parse(HaveRead)[0];
                    SomConfig.DataBase = array.Value<string>("DataBase");
                    SomConfig.DataBaseConfig();
                    SomConfig.Port = array.Value<string>("Port");
                    file.Close();
                }
                if (!optionsBuilder.IsConfigured)
                {
                    optionsBuilder.UseLoggerFactory(loggerFactory);
                }
                optionsBuilder.UseSqlServer(SomConfig.OMSConfig);
            }
  • 相关阅读:
    Topic for paper reading
    Github
    APPIUM+Python+HTMLTestRunner(转)
    PyCharm 2016.3.2 汉化
    APPIUM 常用API(转)
    Python IDE PyCharm2016.3.2(转)
    APPIUM笔记
    将博客搬至CSDN
    碎碎念
    关于set或map的key使用自定义类型的问题
  • 原文地址:https://www.cnblogs.com/jiangyunfeng/p/12572408.html
Copyright © 2011-2022 走看看