如何通过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
相关产品推荐
相关产品推荐

