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

如何通过appsettings.json配置Serilog排除EF Core数据库查询日志?

问题描述

我之前在Program.cs中添加以下代码,成功从控制台/调试日志中隐藏了SQL数据库日志:

builder.Host.UseSerilog((builderContext, config) =>
{
    config.ReadFrom.Configuration(builderContext.Configuration);
    config.Filter.ByExcluding(Matching.FromSource("Microsoft.EntityFrameworkCore.Database.Command"));
});

现在想通过appsettings.json文件配置来实现同样效果,但尝试了以下配置却未生效:

"Serilog": {
    "MinimumLevel": {
        "Default": "Information"
    },
    "WriteTo": [
        {
            "Name": "Console",
            "Args": { "outputTemplate": "[{Timestamp:dd/MM/yyyy HH:mm:ss ffff zzz} {Level:u3}] {Message:lj}{NewLine}{Exception}" }
        },
        {
            "Name": "Debug",
            "Args": { "outputTemplate": "[{Timestamp:dd/MM/yyyy HH:mm:ss ffff zzz} {Level:u3}] {Message:lj}{NewLine}{Exception}" }
        },
    ],
    // 尝试了这段但无效
    "Filter": [
        {
            "Name": "ByExcluding",
            "Args": {
                "expression": "SourceContext = 'Microsoft.EntityFrameworkCore.Database.Command'"
            }
        }
    ],
    "Enrich": [
        "FromLogContext"
    ]
},  

请问该如何正确配置?

解决方案

提供两种可行的配置方式,按需选择:

方式一:通过级别覆盖(推荐,无需额外依赖)

直接在MinimumLevel节点下对EF Core数据库命令的日志源设置更高的级别——EF的SQL查询日志属于Information级别,将其覆盖为Warning后,这类日志就不会被输出:

修改appsettings.json的Serilog配置:

"Serilog": {
    "MinimumLevel": {
        "Default": "Information",
        "Override": {
            "Microsoft.EntityFrameworkCore.Database.Command": "Warning"
        }
    },
    "WriteTo": [
        {
            "Name": "Console",
            "Args": { "outputTemplate": "[{Timestamp:dd/MM/yyyy HH:mm:ss ffff zzz} {Level:u3}] {Message:lj}{NewLine}{Exception}" }
        },
        {
            "Name": "Debug",
            "Args": { "outputTemplate": "[{Timestamp:dd/MM/yyyy HH:mm:ss ffff zzz} {Level:u3}] {Message:lj}{NewLine}{Exception}" }
        }
    ],
    "Enrich": [
        "FromLogContext"
    ]
}

方式二:通过Filter配置(需安装依赖包)

如果坚持使用Filter方式,首先需要安装Serilog.Expressions包,因为配置文件中的Filter表达式依赖该包:

dotnet add package Serilog.Expressions

然后修正appsettings.json的Filter配置,同时必须移除Program.cs中手动添加的Filter.ByExcluding语句,避免规则冲突:

修正后的appsettings.json配置:

"Serilog": {
    "MinimumLevel": {
        "Default": "Information"
    },
    "WriteTo": [
        {
            "Name": "Console",
            "Args": { "outputTemplate": "[{Timestamp:dd/MM/yyyy HH:mm:ss ffff zzz} {Level:u3}] {Message:lj}{NewLine}{Exception}" }
        },
        {
            "Name": "Debug",
            "Args": { "outputTemplate": "[{Timestamp:dd/MM/yyyy HH:mm:ss ffff zzz} {Level:u3}] {Message:lj}{NewLine}{Exception}" }
        }
    ],
    "Filter": [
        {
            "Name": "ByExcluding",
            "Args": {
                "expression": "SourceContext = 'Microsoft.EntityFrameworkCore.Database.Command'"
            }
        }
    ],
    "Enrich": [
        "FromLogContext"
    ]
}

关键注意事项

无论采用哪种方式,都要确保Program.cs中的Serilog初始化代码仅从配置文件读取规则,移除手动添加的过滤语句:

builder.Host.UseSerilog((builderContext, config) =>
{
    config.ReadFrom.Configuration(builderContext.Configuration);
});

内容的提问来源于stack exchange,提问作者Mihai Socaciu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:47:03