將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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM