使用现有LoggerFactory记录实体框架核心

时间:2020-07-08 11:24:24

标签: logging .net-core ef-core-3.0

我正在尝试记录由ef core执行的SQL查询。创建主机后,在 CreateHostBuilder 上配置了日志记录,因此我想使用最终创建的LoggerFactory记录EF Core的执行情况。因此,我试图避免在DbContext上声明另一个LoggerFactory并定义提供程序,因为它们将与我为该应用程序配置的相同。

因此,我正在使用以下代码配置日志记录:

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureLogging(logging => {
                logging.ClearProviders()
                       .AddConsole()
                       .AddDebug()
                       .AddAzureWebAppDiagnostics();
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            })
            .UseNLog();

如您所见,我正在使用NLog作为提供程序来登录文件。在DbContext类上,我有以下代码:

public class MyDbContext : DbContext
{
    public IServiceProvider Services { get; set; }

    public MyDbContext(DbContextOptions<MyDbContext> options, IServiceProvider serviceProvider) 
        : base(options) 
            { Services = serviceProvider; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        string showTrace = Environment.GetEnvironmentVariable("SHOW_EFCORE_TRACE");

        var loggerFactory = (ILoggerFactory) Services.GetService(typeof(ILoggerFactory));

        if (!string.IsNullOrWhiteSpace(showTrace) &&
            showTrace.Equals("on", StringComparison.InvariantCultureIgnoreCase)) 
                                    { optionsBuilder.UseLoggerFactory(loggerFactory); }
    }
}

这不起作用。如果看到引用从服务获得的LoggerFactory的loggerFactory变量,则可以看到NLog提供程序(包括控制台和调试)。但是执行查询时,不会写入日志。

我尝试了另一种选择,使用以下代码(两者均无效)通过DI获得LoggerFactory:

public class MyDbContext : DbContext
{

    public readonly ILoggerFactory MyLoggerFactory;

    public MyDbContext(DbContextOptions<MyDbContext> options, ILoggerFactory fact) 
        : base(options) { MyLoggerFactory = fact; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        string showTrace = Environment.GetEnvironmentVariable("SHOW_EFCORE_TRACE");

        if (!string.IsNullOrWhiteSpace(showTrace) &&
            showTrace.Equals("on", StringComparison.InvariantCultureIgnoreCase)) 
                                    { optionsBuilder.UseLoggerFactory(MyLoggerFactory); }
    }
}

因此,我设法获取日志记录的唯一方法是创建并实例化一个新的LoggerFactory。但这迫使我两次设置(并在需要时进行更改)提供者,而这正是我要避免的事情。而且我不明白,如果我使用已经为整个应用程序创建的LoggerFactory并配置了所需的提供程序,为什么不写日志。

0 个答案:

没有答案