无需调整日志级别,如何阻止Serilog记录Entity Framework相关SQL查询
解决方案
你可以通过以下两种方式实现保留EF异常日志、同时移除日志中SQL内容的需求:
方案1:EF Core 层面直接配置(推荐)
直接在DbContext的配置逻辑中显式关闭异常附带SQL语句的特性,不需要修改任何Serilog规则。修改你的AddDbContext代码块即可:
services.AddDbContext<TTApplicationDbContext>(options => { options.UseSqlServer(configuration.GetConnectionString("DefaultConnection")) // 显式禁用敏感数据日志(默认就是false,显式配置更稳妥) .EnableSensitiveDataLogging(false) // 禁用详细错误日志,不会再把SQL语句附加到异常消息中 .EnableDetailedErrors(false); });
EnableDetailedErrors默认在生产环境为关闭状态,如果你在开发环境手动开启过该配置,显式设为false后,EF抛出的异常里就不会再包含生成的SQL语句,同时异常本身的堆栈、核心错误信息都会完整保留。
方案2:Serilog层面过滤EF的SQL日志内容
如果你不想修改EF配置,也可以通过Serilog的重写规则,把EF相关日志里的SQL内容替换为空,只保留核心错误信息。首先需要安装Serilog.Expressions NuGet包,之后修改Serilog的配置:
Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(configuration) // 过滤掉EF正常执行的命令信息级日志 .Filter.ByExcluding(evt => evt.Properties.TryGetValue("SourceContext", out var sourceCtx) && sourceCtx.ToString().Contains("Microsoft.EntityFrameworkCore.Database.Command") && evt.Level == LogEventLevel.Information ) // 重写EF异常消息,移除SQL内容 .Enrich.With(evt => { if (evt.Exception is Microsoft.EntityFrameworkCore.DbUpdateException) { // 仅保留核心错误提示,截断后续冗长的SQL内容,可根据实际日志格式调整匹配规则 evt.AddOrUpdateProperty("Message", "EF数据库操作执行异常,请查看异常堆栈定位具体问题"); } }) .WriteTo.Console(LogEventLevel.Verbose, logFormat) .WriteTo.File(ApplicationInfo.GetDataFileName("log"), LogEventLevel.Verbose, logFormat) .CreateLogger();
两种方案选其一即可,方案1不需要引入额外依赖,配置更简单;方案2可以灵活自定义替换规则,适合需要保留部分SQL相关提示的场景。
内容的提问来源于stack exchange,提问作者Jonathan Wood
相关产品推荐
相关产品推荐

