我正在尝试记录由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并配置了所需的提供程序,为什么不写日志。