在.netcore中如何让entityframeworkcore在日志中记录由linq生成的sql语句

dotNET跨平台 dotNET跨平台     2023-03-08     615

关键词:

在开发中,我们想在调试中查看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,日志级别为Information
            if (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 3.1 中的 Newtonsoft JsonConverter 中注入依赖项

】如何在.netcore3.1中的NewtonsoftJsonConverter中注入依赖项【英文标题】:HowtoinjectdependencyinNewtonsoftJsonConverterin.netcore3.1【发布时间】:2021-10-1102:02:14【问题描述】:我无法让依赖注入在.netcore3.1中为以下NewtonsoftJsonConverter工作。我只... 查看详情

ASP.NET Core 3.1 MVC 如何让用户在注册时选择自己的角色?

】ASP.NETCore3.1MVC如何让用户在注册时选择自己的角色?【英文标题】:ASP.NETCore3.1MVCHowtoallowtheusertoselecthisrolewhenregistering?【发布时间】:2020-07-0406:41:38【问题描述】:我正在创建一个ASP.NETCore3.1应用程序。我添加了“买家”和“卖... 查看详情

asp.netcore中的缓存[1]:如何在一个asp.netcore应用中使用缓存

.NETCore针对缓存提供了很好的支持,我们不仅可以选择将数据缓存在应用进程自身的内存中,还可以采用分布式的形式将缓存数据存储在一个“中心数据库”中。对于分布式缓存,.NETCore提供了针对Redis和SQLServer的原生支持... 查看详情

如何在 .Net Core 2.0 中创建应用程序变量?

】如何在.NetCore2.0中创建应用程序变量?【英文标题】:HowtocreateApplicationvariablein.NetCore2.0?【发布时间】:2018-09-2912:51:57【问题描述】:我使用.NetCore2.0创建了网站。现在我想存储一些不是用户特定的值,我想让这些值在所有登录... 查看详情

如何在 Rider IDE 中更改 SDK 版本 asp netcore?

】如何在RiderIDE中更改SDK版本aspnetcore?【英文标题】:HowtochangeSDKversionaspnetcoreinRiderIDE?【发布时间】:2021-11-2722:10:00【问题描述】:创建asp.netcore时如何将sdk版本从6更改为5该选项显示为禁用我安装了netcore3.1、sdk5和sdk6感谢您的... 查看详情

如何在 ASP.NET Core 中使用区域

】如何在ASP.NETCore中使用区域【英文标题】:HowtouseanAreainASP.NETCore【发布时间】:2016-07-3120:05:14【问题描述】:如何在ASP.NETCore中使用Area?我有一个需要管理部分的应用。此部分要求将其视图放置在该区域中。所有以Admin/开头的... 查看详情

如何让 mvc 管道在 .net core 5 中对 oidc 进行身份验证

】如何让mvc管道在.netcore5中对oidc进行身份验证【英文标题】:Howtogetmvcpipelinetoauthenticateoidcin.netcore5【发布时间】:2021-12-2919:49:00【问题描述】:我正在尝试找出一种让mvc对AzureADoidc令牌进行身份验证的方法。我的应用程序只是后... 查看详情

如何在 ASP.NET Core 中返回存储为 byte[] 的文件?

】如何在ASP.NETCore中返回存储为byte[]的文件?【英文标题】:HowdoIreturnafilestoredasbyte[]inASP.NETCore?【发布时间】:2020-05-1614:21:17【问题描述】:我已经搜索了一段时间,虽然它应该很简单,但我无法让它工作。根据我看到的例子,... 查看详情

如何在.netcore中修改querystring?(代码片段)

...xff0c;而且还有恶心的编码解码问题,所以我更希望用.NETCore中内建的工具提取,而且也不需要操心escape问题。我知道在Asp.NET 查看详情

如何在 ASP.net Core 中添加 js 和 css 文件?

】如何在ASP.netCore中添加js和css文件?【英文标题】:HowtoaddjsandcssfilesinASP.netCore?【发布时间】:2016-10-0319:35:44【问题描述】:我被分配将应用程序从MVC迁移到ASP.netCore,我是ASP.netCore的新手。在MVC中我们有BundleConfig.cs并在其中添... 查看详情

如何在 ASP.NET Core 2.2 中实现标识

】如何在ASP.NETCore2.2中实现标识【英文标题】:HowtoimplementIdentityinASP.NETCore2.2【发布时间】:2019-06-2511:45:21【问题描述】:在我的网站中,我想让管理员使用帐户登录以修改数据库。另外,我将来可能会添加一些角色和帐户。所... 查看详情

如何在 .NET Core 中卸载程序集/使其可收藏?

】如何在.NETCore中卸载程序集/使其可收藏?【英文标题】:Howtounloadanassemblyin.NETCore/makeitcollectible?【发布时间】:2020-09-1223:28:11【问题描述】:如何在.NETCore中卸载程序集?注意:.NETCore不支持AppDomain。背景:我必须动态评估用户... 查看详情

如何在asp.netcore中获取客户端ip?(代码片段)

...ables["REMOTE_ADDR"]来获取客户端IP地址,请问在ASP.NETCore中我该如何实现呢?回答区CodingYourLife如果你用的是.NET5,可以用内部提供的扩展方法来实现获取客户端IP,参考代码如下ÿ 查看详情

如何让 VSTS 使用 net Net Standard Azure Functions 找到我的 NetCore 单元测试?

】如何让VSTS使用netNetStandardAzureFunctions找到我的NetCore单元测试?【英文标题】:HowdoIgetVSTStofindmyNetCoreunittestswithnetNetStandardAzureFunctions?【发布时间】:2018-06-0621:26:08【问题描述】:我在VSTS中有一个构建管道设置,它不断报告它找... 查看详情

如何在 .NET Core 中修改文件访问控制

】如何在.NETCore中修改文件访问控制【英文标题】:Howtomodifyfileaccesscontrolin.NETCore【发布时间】:2017-03-1921:34:30【问题描述】:我正在尝试更改.NETCore中文件的权限。但是,FileInfo似乎不再有任何SetAccessControl。//CreateanewFileInfoobject.... 查看详情

.netcore中间件如何在类库中使用

参考技术A1、app.Use()2、app.Run()默认会终止后面的所有管道事件或者中间件等函数,如果app.Use()去掉了awaitnext.Invoke()就和app.Run()是等价的效果3、app.Map()这个方法为我们提供了一些方便的分支处理,它是在管道中增加了分支。通过... 查看详情

如何让最小api绑定查询字符串中的数组(代码片段)

前言在上次的文章中,我们实现了《让ASP.NETCore支持绑定查询字符串中的数组》:[HttpGet]public string Get([FromQuery][ModelBinder(BinderType = typeof(IntArrayModelBinder))] int[] values)    return string.Join("  查看详情

如何在 ASP.NET Core 2.0 中根据路由配置服务身份验证

】如何在ASP.NETCore2.0中根据路由配置服务身份验证【英文标题】:HowtoConfigureServicesAuthenticationbasedonroutesinASP.NETCore2.0【发布时间】:2018-03-0922:06:40【问题描述】:在ASP.NETCore1.x中,我可以在Configure中使用身份验证方法,但现在在ASP... 查看详情