zoukankan      html  css  js  c++  java
  • 将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
  • 相关阅读:
    【数据结构栈应用系列】括号匹配
    【二叉树系列】二叉树课程大作业
    Tomcat在Linux上的安装与配置
    索引介绍及创建与删除索引
    Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结
    Tomcat的配置文件server.xml叙述
    问题及解决方法
    Oracle DB 查看预警日志
    报表简介
    Nginx负载均衡与反向代理—《亿级流量网站架构核心技术》
  • 原文地址:https://www.cnblogs.com/WNpursue/p/11668503.html
Copyright © 2011-2022 走看看