使用EF Core配置Serilog ASP.Net Core 3.2以记录SQL统计信息。

问题描述 投票:0回答:1

以前在使用 Microsoft.Extensions.Logging 我会注入 ILoggerFactory.UseLoggingFactory() 当设置我的DbContext时,我的DbContext如下所示(为简洁起见有所减少)。

    private readonly ILoggerFactory LoggerFactory;


    public Startup(... ILoggerFactory loggerFactory)
    {
        LoggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
    }

    public void ConfigureServices(IServiceCollection services)
    {
        var connectionString = Configuration.GetConnectionString($"DbDataContext");

        services.AddDbContext<OakfieldLeasingDataContext>(
            options => options
                .UseSqlServer(
                    connectionString,
                    x => x.UseNetTopologySuite())
                .UseLoggerFactory(LoggerFactory));
     }

我现在想换成 Serilog我已经成功改变了我的 Program.cs 如下图所示。

    public static void Main(string[] args)
    {
        Log.Logger = new LoggerConfiguration()
        .MinimumLevel.Debug()
        .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
        .Enrich.FromLogContext()
        .WriteTo.Console(new RenderedCompactJsonFormatter())
        .WriteTo.File(new RenderedCompactJsonFormatter(), "./logs/log.ndjson")
        .CreateLogger();

        try
        {
            Log.Information("Starting up");
            CreateHostBuilder(args).Build().Run();
        }
        catch (Exception ex)
        {
            Log.Fatal(ex, "Application start-up failed");
        }
        finally
        {
            Log.CloseAndFlush();
        }
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
        .UseSerilog() 
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

并能成功确认日志进入日志文件。但是,用现有的代码,我得到了以下错误。

System.InvalidOperationException: 在尝试激活'Blazor.Server.Startup'时,无法解析'Microsoft.Extensions.Logging.ILoggerFactory'类型的服务。

谁能告诉我如何将Serilog LoggerFactory注入EF Core来记录SQL的生成请问?

c# entity-framework-core serilog blazor-server-side
1个回答
-1
投票

从3.0开始,你可以注入到Startup的类型是有限制的。这是一个误导性的功能,因为它使用了一个完全独立的DI容器与应用程序的其余部分。你仍然可以注入 ILogger<T> 到你 Configure 方法,而不再是直接进入构造函数或 ConfigureServices

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
    {

在你的dbcontext类中,你可以这样使用。

ILogger<DBContextClass> _logger;
        public DBContextClass(ILogger<EngageAPIController> logger)
        {               
            _logger = logger;
        }
© www.soinside.com 2019 - 2024. All rights reserved.