[英]Configuring Serilog ASP.Net Core 3.2 with EF Core to log SQL statments
以前在使用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 代?
程序.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))
您需要通过以下方式包含数据库上下文:
services.AddDbContext<OakfieldLeasingDataContext>(
options => options
.UseSqlServer(
connectionString,
x => x.UseNetTopologySuite())
.LogTo(Log.Logger.Information, LogLevel.Information, null));
从 3.0 开始,您可以注入 Startup 的类型是有限的。 这是一个误导性的功能,因为它使用了与应用程序的 rest 完全分离的 DI 容器。 您仍然可以直接将ILogger<T>
注入到Configure
方法中,但不再注入到构造函数或ConfigureServices
中
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
{
在您的 dbcontext class 中,您可以像这样使用。
ILogger<DBContextClass> _logger;
public DBContextClass(ILogger<EngageAPIController> logger)
{
_logger = logger;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.