将EntityFrameworkCore生成的SQL语句输出到控制台,使用hangfire
将EntityFrameworkCore生成的SQL语句输出到控制台
参考文档如下
EF Core 日志记录要求使用一个或多个日志记录提供程序配置的 ILoggerFactory。
日志记录-EF Core | Microsoft Docs
安装适当的包后,应用程序应创建 Server.loggerfactory 的单一实例/全局实例。 例如,使用控制台记录器:
public static readonly ILoggerFactory MyLoggerFactory
= LoggerFactory.Create(builder => { builder.AddConsole(); });
然后,应该在 DbContextOptionsBuilder 上向 EF Core 注册此单一实例/全局实例。 例如:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseLoggerFactory(MyLoggerFactory) // Warning: Do not create a new ILoggerFactory instance each time
.UseSqlServer(
@"Server=(localdb)\mssqllocaldb;Database=EFLogging;Trusted_Connection=True;ConnectRetryCount=0");
筛选记录内容
应用程序可以通过在 ILoggerProvider 上配置筛选器来控制要记录的内容。 例如:
public static readonly ILoggerFactory MyLoggerFactory
= LoggerFactory.Create(builder =>
{
builder
.AddFilter((category, level) =>
category == DbLoggerCategory.Database.Command.Name
&& level == LogLevel.Information)
.AddConsole();
});
abp中使用
选择 *.EntityFrameworkCore 项目
找到 *DbContext
添加如下代码
public static readonly ILoggerFactory MyLoggerFactory
= LoggerFactory.Create(builder =>
{
builder
.AddFilter((category, level) =>
category == DbLoggerCategory.Database.Command.Name
&& level == LogLevel.Information)
.AddConsole();
});
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseLoggerFactory(MyLoggerFactory)
.EnableSensitiveDataLogging(true);
使用 Hangfire
添加nuget 包 Hangfire ...
getting-started Hangfire
- 找到并修改 **HttpApiHostModule
在 Startup.cs 直接进入
using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Volo.Abp;
namespace MyBookStore
{
public class Startup
{
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddApplication<MyBookStoreHttpApiHostModule>(options =>
{
options.UseAutofac();
});
return services.BuildServiceProviderFromFactory();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
{
app.InitializeApplication();
}
}
}
- 添加使用的Configure
private void ConfigureHangfire(ServiceConfigurationContext context, IConfigurationRoot Configuration)
{
// https://github.com/marcoCasamento/Hangfire.Redis.StackExchange
context.Services.AddHangfire(configuration =>
{
configuration.UseRedisStorage(Configuration["Redis:Configuration"]);
});
////https://github.com/perrich/Hangfire.MemoryStorage
//context.Services.AddHangfire(config =>
//{
// config.UseMemoryStorage();
//});
// https://docs.hangfire.io/en/latest/getting-started/aspnet-core-applications.html
//// Add Hangfire services.
//context.Services.AddHangfire(configuration => configuration
// .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
// .UseSimpleAssemblyNameTypeSerializer()
// .UseRecommendedSerializerSettings()
// .UseSqlServerStorage(Configuration.GetConnectionString("HangfireConnection"), new SqlServerStorageOptions
// {
// CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
// SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
// QueuePollInterval = TimeSpan.Zero,
// UseRecommendedIsolationLevel = true,
// UsePageLocksOnDequeue = true,
// DisableGlobalLocks = true
// }));
// Add the processing server as IHostedService
context.Services.AddHangfireServer();
context.Services.AddTransient<HangfireService>();
}
- 使用 Hangfire
public class HangfireService
{
private readonly ILibraryService _service;
public HangfireService(ILibraryService service)
{
_service = service;
}
public async Task AddLibraryDto(LibraryDto model)
{
Console.WriteLine($"HangfireService 开始 在:{DateTime.Now.ToLongTimeString()} 启动");
await _service.AddLibraryDto(model);
Console.WriteLine($"HangfireService 结束 在:{DateTime.Now.ToLongTimeString()}");
}
//private IServiceProvider serviceProvider { get; }
//public HangfireService(IServiceProvider _serviceProvider)
//{
// serviceProvider = _serviceProvider;
//}
//public async Task AddLibraryDto(LibraryDto model)
//{
// Console.WriteLine($"HangfireService 开始 在:{DateTime.Now.ToLongTimeString()} 启动");
// using (var serviceScope = serviceProvider.GetService<IServiceScopeFactory>().CreateScope())
// {
// var service = serviceScope.ServiceProvider.GetService<HangfireService>();
// await service.AddLibraryDto(model);
// }
// Console.WriteLine($"HangfireService 结束 在:{DateTime.Now.ToLongTimeString()}");
//}
}
- test
[HttpGet("AddLibrary")]
public async Task<LibraryDto> AddLibrary()
{
try
{
var watch = new Stopwatch();
watch.Start();//开始计时
Console.WriteLine($"LibraryController 开始 在:{DateTime.Now.ToLongTimeString()} 启动");
Thread.Sleep(1000);
var dto = new LibraryDto
{
Name = "添加一条",
Address = "1号"
};
var model = await _service.AddLibraryDto(dto);
Console.WriteLine($"LibraryController 结束 在:{DateTime.Now.ToLongTimeString()}");
watch.Stop();//停止计时
Console.WriteLine("耗时:" + (watch.ElapsedMilliseconds));//输出时间 毫秒
var watch2 = new Stopwatch();
watch2.Start();//开始计时
for (var i = 0; i < 1000; i++)
{
BackgroundJob.Enqueue<HangfireService>(jobs => jobs.AddLibraryDto(model));
//var jobId = BackgroundJob.Enqueue(
// () => _hangfireService.AddLibraryDto(model));
}
watch2.Stop();//停止计时
Console.WriteLine("hangfire 耗时:" + (watch2.ElapsedMilliseconds));//输出时间 毫秒
return model;
}
catch (Exception ex)
{
return new LibraryDto
{
Name = ex.Message
};
}
}
- 打开浏览器 localhost:*/hangfire
将EntityFrameworkCore生成的SQL语句输出到控制台,使用hangfire的更多相关文章
- ABP框架 将EntityFrameworkCore生成的SQL语句输出到控制台
首先 在 EntityFrameworkCore中安装 Microsoft.Extensions.Logging.Console nuget install Microsoft.Extensions. ...
- .NET Core实用技巧(一)如何将EF Core生成的SQL语句显示在控制台中
目录 .NET Core实用技巧(一)如何将EF Core生成的SQL语句显示在控制台中 前言 笔者最近在开发和维护一个.NET Core项目,其中使用几个非常有意思的.NET Core相关的扩展,在 ...
- .net core 利用日志查看ef生成的SQL语句
EF Core 没有直接提供像 EF6 那样方便的在日志中记录最终生成的 SQL 的功能,可以通过官方提供的日志记录(Microsoft.Extensions.Logging)实现. 一. 使用 Mi ...
- 深入理解 LINQ to SQL 生成的 SQL 语句
Ø 简介 在 C# 中与数据交互最常用的语句就是 LINQ 了,而 LINQ to SQL 是最直接与数据库打交道的语句,它可以根据 LINQ 语法生成对应的 SQL 语句,在数据库中去执行.本文主 ...
- Console程序下监控EFCore生成的SQL语句!
最近这两天在使用控制台程序学习EFCore,突然想看看生成的SQL语句,所以在网上找到一位大神的分享的方法! 准备工作: 1). MySqlEFCore NuGet: Pomelo.EntityF ...
- EFCore常规操作生成的SQL语句一览
前言 EFCore的性能先不说,便捷性绝对是.Net Core平台下的ORM中最好用的,主要血统还百分百纯正. EFCore说到底还是对数据库进行操作,无论你是写Lamda还是Linq最后总归都是要生 ...
- 使用EntityFramework6.1的DbCommandInterceptor拦截生成的SQL语句
开始 EF6.1也出来不少日子了,6.1相比6.0有个很大的特点就是新增了System.Data.Entity.Infrastructure.Interception 命名空间,此命名空间下的对象可以 ...
- 用LinqPad查看Nhibernate生成的sql语句
使用Nhibernate开发一般都要对Nhibernate生成的sql语句进行查看及分析,查看Nhibernate生成的sql语句,可以使用NHProfiler和log4net.但NHProfiler ...
- 【转】Hibernate利用@DynamicInsert和@DynamicUpdate生成动态SQL语句
原文链接:http://www.cnblogs.com/quanyongan/p/3152290.html 最近在使用Hibernate4中,发现两个很有奥秘的注解 @DynamicInsert 和 ...
随机推荐
- nginx常用伪静态设置
nginx里使用伪静态是直接在nginx.conf 中写规则的,并不需要像apache要开启写模块(mod_rewrite)才能进行伪静态. nginx只需要打开nginx.conf配置文件,在ser ...
- Alipay支付宝调用错误:Call to undefined function openssl_sign()
打开php.ini,找到这一行 ;extension=php_openssl.dll,将前面的“;”去掉: 重启服务器.
- asp.net core mvc基于Redis实现分布式锁,C# WebApi接口防止高并发重复请求,分布式锁的接口幂等性实现
使用背景:在使用app或者pc网页时,可能由于网络原因,api接口可能被前端调用一个接口重复2次的情况,但是请求内容是一样的.这样在同一个短暂的时间内,就会有两个相同请求,而程序只希望处理第一个请求, ...
- @TableField
@TableField 描述:字段注解(非主键) 属性 类型 必须指定 默认值 描述 value String 否 "" 字段名 el String 否 "" ...
- 如何修改dedecms专题目录默认名称special
专题有一个聚合的效果,一般会比普通的文章页更符合用户需求.如果用dedecms建专题的话,默认的目录是special,怎么修改修改dedecms专题目录名称呢,比如将/special/改为/s/这样更 ...
- Python基础之内置方法
目录 字符串的内置方法 按索引取值 切片(顾头不顾尾,步长) 长度len 成员运算 移除两边空白strip 切分split 循环 lower&upper startswith & en ...
- JDOJ 2982: 最大连续子段和问题
洛谷 P1115 最大子段和 洛谷传送门 JDOJ 2982: 最大连续子段和问题 JDOJ传送门 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入格式 第一行是一个正整数NN, ...
- Rotor里的异常处理
我看到了一些关于Rotor(和CLR)中使用的异常处理机制的问题.下面是关于Rotor异常处理的另一个注意事项列表.目的是帮助Rotor开发人员调试和理解CLR中的异常. 异常生成和抛出 此步骤在很大 ...
- django跨域问题解决
在django中,访问非同源网站(协议,域名,端口号)时,会出现: 解决方案: 1.安装 django-cors-headers pip install django-cors-headers 2.修 ...
- The import junit cannot be resolved解决问题
第一次安装Junit,配置环境之后发现添加语句import junit.framework.TestCase; 编译错误 解决:项目右键Properties->Java Build Path-& ...