我有一个使用实体框架核心的控制台.net核心应用程序。 该应用程序使用日志框架写入文件和控制台:
serviceProvider = new ServiceCollection()
.AddLogging()
.AddDbContext<DataStoreContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")))
.BuildServiceProvider();
//configure console logging
serviceProvider.GetService<ILoggerFactory>()
.AddConsole(LogLevel.Debug)
.AddSerilog();
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.RollingFile(Path.Combine(Directory.GetCurrentDirectory(), "logs/vcibot-{Date}.txt"))
.WriteTo.RollingFile(Path.Combine(Directory.GetCurrentDirectory(), "logs/vcibot-errors-{Date}.txt"), LogEventLevel.Error)
.CreateLogger();
logger = serviceProvider.GetService<ILoggerFactory>()
.CreateLogger<Program>();
文件输出的最低级别设置为信息。但使用此设置输出还包含 SQL 查询,示例如下:
2017-02-06 10:31:38.282 -08:00 [信息] 执行 DbCommand (0ms) [参数=[],CommandType='文本',CommandTimeout='30'] 选择 [f].[构建标识符]、[f].[分支]、[f].[构建日期]、 [f].[StaticAssetSizeInKb] FROM [FileSizesHistoryEntries] AS [f]
有没有办法禁用 SQL 查询日志记录(仅在调试日志级别记录它们)
如果您使用内置记录器,您可以在 Program.cs 中向 ILoggingBuilder 添加过滤器。
所以,它可以看起来像:
WebHost.CreateDefaultBuilder(args)
// ...
.ConfigureLogging((context, logging) => {
var env = context.HostingEnvironment;
var config = context.Configuration.GetSection("Logging");
// ...
logging.AddConfiguration(config);
logging.AddConsole();
// ...
logging.AddFilter("Microsoft.EntityFrameworkCore.Database.Command", LogLevel.Warning);
})
// ...
.UseStartup<Startup>()
.Build();
不知道这是否仍然是一个活跃的问题,但这是我的解决方案,覆盖“Microsoft.EntityFrameworkCore.Database.Command”的最低级别
Log.Logger = new LoggerConfiguration()
.MinimumLevel.ControlledBy(loggingLevelSwitch)
.MinimumLevel.Override("Microsoft.EntityFrameworkCore.Database.Command", Serilog.Events.LogEventLevel.Warning)
.Enrich.WithProperty("app", environment.ApplicationName)
.Enrich.FromLogContext()
.WriteTo.RollingFile($"./Logs/{environment.ApplicationName}")
.CreateLogger();
您也可以将其放在 appconfig.json 中
"Serilog": {
"Using": [ "Serilog.Sinks.Console" ],
"MinimumLevel": {
"Default": "Verbose",
"Override": {
"Microsoft": "Warning",
"Microsoft.EntityFrameworkCore.Database.Command": "Warning"
}
},
"WriteTo": [
{
"Name": "Console",
"Args": {
"outputTemplate": "[{Timestamp:u}] [{Level:u3}] {SourceContext} {Message:lj}{NewLine}{Exception}"
}
},
],
"Enrich": [ "FromLogContext", "WithExceptionDetails" ]
}
发现如果按以下方式修改日志记录部分,我将看不到与 SQL 查询相关的 EF 日志消息:
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Information",
"Microsoft.Hosting.Lifetime": "Information",
"Microsoft.EntityFrameworkCore.Database.Command": "Warning"
}
}
如果您使用默认 Logger,请在
appsettings.json
(或用于开发启动的 appesttings.Development.json
)文件中:
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Warning" <----
}
},
将其设置为
Warning
而不是 Information
。
您想要更改 Serilog 配置以将
Microsoft.EntityFrameworkCore.Storage.IRelationalCommandBuilderFactory
上下文的最低级别设置为 Warning
或更高。
您可以通过将输出模板设置为
[{Timestamp:HH:mm:ss} {SourceContext} [{Level}] {Message}{NewLine}{Exception}
之类的内容来找到需要更改的上下文。了解上下文后,您可以将模板设置回之前的状态。
首先找到生成 SQL 查询的源上下文。为此,请按照此处所述设置outputTemplate。
然后在LoggerConfiguration中添加
.MinimumLevel.Override(<your_source_context>, LogEventLevel.Warning)
这些答案对我不起作用,然后我找到了这个:
在您的 Programs.cs 上,创建构建器,添加该行:
builder.Logging.AddFilter("Microsoft.EntityFrameworkCore.Database.Command", LogLevel.Warning);