You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需调整日志级别,如何阻止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 06:57:00