將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