【问题标题】:Configuring Serilog ASP.Net Core 3.2 with EF Core to log SQL statments使用 EF Core 配置 Serilog ASP.Net Core 3.2 以记录 SQL 语句
【发布时间】:2020-06-10 09:28:18
【问题描述】:

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

    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 生成?

【问题讨论】:

  • 在 3.0 中,他们进行了更改以限制您可以注入 Startup 的类型。这是一个误导性的功能,因为它使用了一个完全独立于应用程序其余部分的 DI 容器。您仍然可以将 ILogger 直接注入到您的 Configure 方法中,但不再注入到构造函数或 ConfigureServices 中
  • @viveknuna 谢谢你的评论,你能建议我如何注入工厂来记录 SQL 语句吗?
  • 赞这个public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) { loggerFactory.AddSerilog();
  • 嗯,好的,但我需要在ConfigureServices 中的点添加,以便在为 EF Core 配置 DbContext 时添加记录器?
  • 对不起,我没有找到你

标签: c# entity-framework-core serilog blazor-server-side


【解决方案1】:

Program.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))

【讨论】:

    【解决方案2】:

    您需要通过以下方式包含数据库上下文:

    services.AddDbContext<OakfieldLeasingDataContext>(
            options => options
                .UseSqlServer(
                    connectionString,
                    x => x.UseNetTopologySuite())
                .LogTo(Log.Logger.Information, LogLevel.Information, null));
    

    【讨论】:

      【解决方案3】:

      从 3.0 开始,您可以注入 Startup 的类型是有限的。这是一个误导性的功能,因为它使用了一个完全独立于应用程序其余部分的 DI 容器。您仍然可以将ILogger&lt;T&gt; 直接注入到您的Configure 方法中,但不能再注入到构造函数或ConfigureServices

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

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

      ILogger<DBContextClass> _logger;
              public DBContextClass(ILogger<EngageAPIController> logger)
              {               
                  _logger = logger;
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-28
        • 2022-07-19
        • 2019-02-02
        • 1970-01-01
        • 2020-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多