首页 > 解决方案 > 使用 EF Core 配置 Serilog ASP.Net Core 3.2 以记录 SQL 语句

问题描述

以前在使用时Microsoft.Extensions.Logging我会注入,ILoggerFactory并且.UseLoggingFactory()在设置我的 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-coreserilogblazor-server-side

解决方案


程序.cs

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .UseSerilog()
                .MinimumLevel.Override("Microsoft.EntityFrameworkCore", Serilog.Events.LogEventLevel.Information)
                    .WriteTo.Console(restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Verbose))

推荐阅读