在 .NET Core 中如何让 Entity Framework Core 在日志中记录由 LINQ 生成的SQL语句
在开发中,我们想在调试中查看EF Core执行的sql语句,可以使用SQL Studio Manager Tools工具,另一种方式是使用EF Core提供的日志。在ASP.NET Core使用Entity Framework Core的日志.
早在Entity Framework Core1.0 ,使用相关的ILoggerProvider ILogger 这些基础接口类.来实现过日志记录.
在Entity Framework Core2.0 估计是为了配合ASP.NET Core的日志.所以对这些接口进行了更进一步的包装,也弃用了一些接口和类,如:IRelationalCommandBuilderFactory ,DbCommandLogData 但是Entity Framework Core2.0 在DbContextOptionsBuilder添加了新的扩展方法.UseLoggerFactory 看到LoggerFactory,研究过ASP.NET Core日志记录的,应该就很熟悉了..这是ASP.NET Core日志记录的工厂类. 也就是为什么我们如果在ASP.NET Core中注入自己的日志记录,也可以通过配置来记录相关的SQL操作的原因. 这里我们主要是直接只监控EF Core的日志.
using dotNET.Core;using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;namespace dotNET.EFCoreRepository
{/// <summary>/// ef 日志/// </summary>public class EFLoggerProvider : ILoggerProvider{public ILogger CreateLogger(string categoryName) => new EFLogger(categoryName);public void Dispose() { }}/// <summary>/// /// </summary>public class EFLogger : ILogger{private readonly string categoryName;public EFLogger(string categoryName) => this.categoryName = categoryName;public bool IsEnabled(LogLevel logLevel) => true;public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter){//ef core执行数据库查询时的categoryName为Microsoft.EntityFrameworkCore.Database.Command,日志级别为Informationif (categoryName == "Microsoft.EntityFrameworkCore.Database.Command"&& logLevel == LogLevel.Information){var logContent = formatter(state, exception);NLogger.Debug(logContent);//TraceMessage("Something happened.");// NLogger.Info(GetCodeLineAndFileName());//TODO: 拿到日志内容想怎么玩就怎么玩吧Console.WriteLine();Console.ForegroundColor = ConsoleColor.Green;Console.WriteLine(logContent);Console.ResetColor();}}public IDisposable BeginScope<TState>(TState state) => null;public void TraceMessage(string message,[System.Runtime.CompilerServices.CallerMemberName] string memberName = "",[System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",[System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0
){NLogger.Debug("message: " + message);NLogger.Debug("member name: " + memberName);NLogger.Debug("source file path: " + sourceFilePath);NLogger.Debug("source line number: " + sourceLineNumber);}public string GetCodeLineAndFileName(){StackTrace insStackTrace = new StackTrace(true);var insStackFrames = insStackTrace.GetFrames();string str = "";foreach(var insStackFrame in insStackFrames){str += String.Format("\nFile: {0}, Line: {1}\n", insStackFrame.GetFileName(), insStackFrame.GetFileLineNumber());}return str;}}
}
第一步:添加日志类
第二步:OnConfiguring 方法添加日志调用
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){var loggerFactory = new LoggerFactory();loggerFactory.AddProvider(new EFLoggerProvider());optionsBuilder.UseLoggerFactory(loggerFactory);base.OnConfiguring(optionsBuilder);}
在 .NET Core 中如何让 Entity Framework Core 在日志中记录由 LINQ 生成的SQL语句相关推荐
- [转帖]2016年时的新闻:ASP.NET Core 1.0、ASP.NET MVC Core 1.0和Entity Framework Core 1.0
ASP.NET Core 1.0.ASP.NET MVC Core 1.0和Entity Framework Core 1.0 http://www.cnblogs.com/webapi/p/5673 ...
- 在Apworks数据服务中使用基于Entity Framework Core的仓储(Repository)实现
<在ASP.NET Core中使用Apworks快速开发数据服务>一文中,我介绍了如何使用Apworks框架的数据服务来快速构建用于查询和管理数据模型的RESTful API,通过该文的介 ...
- Entity Framework Core 2.0 全局查询过滤器
本博文翻译自: http://gunnarpeipman.com/2017/08/ef-core-global-query-filters/ Entity Framework Core 2.0 全局查 ...
- Entity Framework Core 执行SQL语句和存储过程
无论ORM有多么强大,总会出现一些特殊的情况,它无法满足我们的要求.在这篇文章中,我们介绍几种执行SQL的方法. 表结构 在具体内容开始之前,我们先简单说明一下要使用的表结构. public clas ...
- Entity Framework Core 批处理语句
在Entity Framework Core (EF Core)有许多新的功能,最令人期待的功能之一就是批处理语句.那么批处理语句是什么呢?批处理语句意味着它不会为每个插入/更新/删除语句发送单独的请 ...
- Entity Framework Core 命名约定
注意:我使用的是 Entity Framework Core 2.0 (2.0.0-preview2-final).正式版发布时,功能可能存在变动.Entity Framework 迁移允许从模型生成 ...
- Entity Framework Core 软删除与查询过滤器
注意:我使用的是 Entity Framework Core 2.0 (2.0.0-preview2-final).正式版发布后,功能可能存在变动. 继续探索Entity Framework Core ...
- 全自动迁移数据库的实现 (Fluent NHibernate, Entity Framework Core)
在开发涉及到数据库的程序时,常会遇到一开始设计的结构不能满足需求需要再添加新字段或新表的情况,这时就需要进行数据库迁移. 实现数据库迁移有很多种办法,从手动管理各个版本的ddl脚本,到实现自己的mig ...
- Entity Framework Core 练习参考
项目地址:https://gitee.com/dhclly/IceDog.EFCore 项目介绍 对 Microsoft EntityFramework Core 框架的练习测试 参考文档教程 官方文 ...
最新文章
- Plugin Error
- jquery实现开关灯
- 如何点击按钮弹出弹框显示几秒_layer消息框显示在鼠标旁边
- 软化边硬化边_夏天多给小朋友吃它,蛋白质是牛肉的3倍,老人吃还能软化血管...
- dedeCMS 静态页面的倒计时插件(原生VS自定义)
- [原创]有关PHP 中 MVC的个人见解
- Nodejs的url模块方法
- 模型算法_生产建模型 算法控效率
- python operator 模块
- php选课系统参考文献,学生选课系统参考文献
- FW: Why PUT and DELETE?铪铪
- HttpSession基础
- 女士品茶——统计学如何变革了科学和生活1
- 给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。
- 解决linux有时候不能粘贴
- CTFshow-吃鸡杯-RE
- 极客云上使用anaconda配置python2.7+tensorflow1.8
- IE浏览器确定兼容性模式
- Nginx Lua 之Shared Dict get()方法在存入字符串超长的情况下不支持高并发
- 关于Java虚拟机(Java Virtual Machine 简称JVM) 笔记