如何在.NET 7控制台应用中配置Serilog记录EF Core查询?
配置.NET 7控制台应用的AppDbContext以用Serilog记录数据库查询
步骤1:注册Serilog的ILoggerFactory到依赖注入
你已注册ILogger,但EF Core需要ILoggerFactory处理日志,需补充以下注册代码:
var logger = new LoggerConfiguration().ReadFrom.Configuration(config).CreateLogger(); services.AddSingleton<ILogger>(logger); // 注册Serilog的LoggerFactory到DI services.AddSingleton<ILoggerFactory>(sp => new SerilogLoggerFactory(logger));
步骤2:配置AppDbContext使用Serilog日志
在注册AppDbContext时,通过UseLoggerFactory指定使用Serilog日志工厂,同时开启EF Core命令日志支持:
services.AddDbContext<AppDbContext>(options => { // 替换为你的数据库提供者(如UseSqlite、UseNpgsql等) options.UseSqlServer("你的数据库连接字符串") // 从DI获取Serilog的LoggerFactory .UseLoggerFactory(serviceProvider => serviceProvider.GetRequiredService<ILoggerFactory>()) // 【可选,仅开发环境】开启敏感数据日志,记录查询参数的实际值 .EnableSensitiveDataLogging(); });
若你的AppDbContext通过构造函数接收DbContextOptions,也可在OnConfiguring方法中配置(推荐优先使用上面的DI注册方式):
public class AppDbContext : DbContext { private readonly ILoggerFactory _loggerFactory; public AppDbContext(DbContextOptions<AppDbContext> options, ILoggerFactory loggerFactory) : base(options) { _loggerFactory = loggerFactory; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { optionsBuilder.UseSqlServer("你的数据库连接字符串") .UseLoggerFactory(_loggerFactory) .EnableSensitiveDataLogging(); } } // 定义你的DbSet public DbSet<YourEntity> YourEntities { get; set; } }
步骤3:调整Serilog配置,开启EF Core命令日志
在配置文件(如appsettings.json)中,需覆盖EF Core命令日志的级别——默认Microsoft类别日志级别为Warning,而EF查询日志属于Microsoft.EntityFrameworkCore.Database.Command类别,级别为Information:
{ "Serilog": { "MinimumLevel": { "Default": "Information", "Override": { "Microsoft": "Warning", // 关键:开启EF Core数据库命令的日志记录 "Microsoft.EntityFrameworkCore.Database.Command": "Information" } }, // 你的Serilog输出配置(如控制台、文件输出等) "WriteTo": [ { "Name": "Console" } ] } }
注意事项
EnableSensitiveDataLogging仅在开发环境使用,生产环境开启可能泄露敏感数据(如用户密码、个人信息等)。- 确保已安装对应数据库提供者的NuGet包(如
Microsoft.EntityFrameworkCore.SqlServer)。
内容的提问来源于stack exchange,提问作者imba
相关产品推荐
相关产品推荐

