博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EF Core如何输出日志到Visual Studio的输出窗口
阅读量:6470 次
发布时间:2019-06-23

本文共 3089 字,大约阅读时间需要 10 分钟。

我们在使用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 state) { return null; } public bool IsEnabled(LogLevel logLevel) { return true; } public void Log
(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func
formatter) { //通过Debugger.Log方法来将EF Core生成的Log信息输出到Visual Studio的输出窗口 Debugger.Log(0, categoryName, "=============================== EF Core log started ===============================\r\n"); Debugger.Log(0, categoryName, formatter(state,exception)+"\r\n"); Debugger.Log(0, categoryName, "=============================== EF Core log finished ===============================\r\n"); } }}

然后定义一个实现了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
options) : base(options) { } public virtual DbSet
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语句:

 

转载地址:http://rscko.baihongyu.com/

你可能感兴趣的文章
IO流之字符流
查看>>
集合异常之List接口
查看>>
Softmax回归
查看>>
紫书 习题11-11 UVa 1644 (并查集)
查看>>
App工程结构搭建:几种常见Android代码架构分析
查看>>
使用openssl进行证书格式转换
查看>>
ZOJ 3777 Problem Arrangement
查看>>
虚拟机类加载机制
查看>>
Callable和Future
查看>>
installshield12如何改变默认安装目录
查看>>
少用数字来作为参数标识含义
查看>>
ScrollView中嵌套ListView
查看>>
JAVA虚拟机05--面试必问之JVM原理
查看>>
Algs4-2.3.1如何切分数组
查看>>
uva 10815 - Andy's First Dictionary(快排、字符串)
查看>>
观察者模式
查看>>
SQL性能优化:如何定位网络性能问题
查看>>
在properties.xml中定义变量,在application.xml中取值问题
查看>>
js 数组
查看>>
Linux scp命令详解
查看>>