Reputation: 10566
I have a console .net core app that uses entity framework core. The app uses logging framework to write to file and console:
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>();
Min Level for file output is set to Information. But with this setup output also contains SQL queries, here is the example:
2017-02-06 10:31:38.282 -08:00 [Information] Executed DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] SELECT [f].[BuildIdentifier], [f].[Branch], [f].[BuildDate], [f].[StaticAssetSizeInKb] FROM [FileSizesHistoryEntries] AS [f]
Is there a way to disable the SQL queries logging (log them only in Debug log level)
Upvotes: 118
Views: 99552
Reputation: 61
this is a solution:
<!--Skip non-critical Microsoft logs and so log only own logs-->
<logger name="Microsoft.*" maxlevel="Fatal" final="true" />
<!-- BlackHole without writeTo -->
<logger name="*" minlevel="Trace" writeTo="mydatabase" />
Upvotes: 0
Reputation: 24766
1.First I have installed these two Nuget packages.
2.Configurations goes like this
var logger = new LoggerConfiguration()
.MinimumLevel.Information()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Warning)
.MinimumLevel.Override("Microsoft.EntityFrameworkCore.Database.Command", LogEventLevel.Warning)
.WriteTo.File(builder.Environment.WebRootPath + "/Logs/SUPCOMS-LOG-.log", rollingInterval: RollingInterval.Day)
.CreateLogger();
builder.Logging.ClearProviders();
builder.Logging.AddSerilog(logger);
3.Log writing looks like this
public class MyClass: IMyInterface
{
private readonly SupcomsDBContext _dBContext;
private readonly ILogger<MyClass> _logger;
public MyClass(SupcomsDBContext dBContext, ILogger<MyClass> logger)
{
this._dBContext = dBContext;
this._logger = logger;
}
public bool MyMethod()
{
_logger.LogError("I have an error");
_logger.LogInformation("This is an information" );
}
}
4.Log file looks like this
Upvotes: 0
Reputation: 9905
I had this issue in one of my projects and noticed that there's a bit more to look at in addition to earlier answers to this question.
You can do things like this:
"Logging": {
"IncludeScopes": true,
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information",
"Microsoft.EntityFrameworkCore": "Warning" <-- Note that this applies to EF Core, including everything in it.
}
}
What's also important is the order where things are added to the ILoggingBuilder
.
// This still will log EF messages to the console.
serviceCollection.AddLogging(builder =>
builder
.AddConsole()
.AddConfiguration(config.GetSection("Logging")));
// This will apply the configuration to the console logger.
serviceCollection.AddLogging(builder =>
builder
.AddConfiguration(config.GetSection("Logging"))
.AddConsole());
Upvotes: 5
Reputation: 71
The answers doesn't work for me then i found this one:
On your Programs.cs, creating builder, add that line:
builder.Logging.AddFilter("Microsoft.EntityFrameworkCore.Database.Command", LogLevel.Warning);
Upvotes: 7
Reputation: 1
First find your source context where sql queries are being generated from. To do that, set outputTemplate as described here.
Then add it in LoggerConfiguration
.MinimumLevel.Override(<your_source_context>, LogEventLevel.Warning)
Upvotes: 0
Reputation: 2779
Found that if Logging section is modified in following manner i am not see EF logs message related to SQL queries:
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Information",
"Microsoft.Hosting.Lifetime": "Information",
"Microsoft.EntityFrameworkCore.Database.Command": "Warning"
}
}
Upvotes: 113
Reputation: 1482
Don't know if this is still an active question, but this is my solution, override the minimum level for "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();
you can also have this on the 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" ]
}
Upvotes: 87
Reputation: 16204
If you are using the default Logger, in the appsettings.json
(or appesttings.Development.json
for dev startup) file:
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Warning" <----
}
},
Set it to Warning
instead of Information
.
Upvotes: 19
Reputation: 1087
If you're using built-in logger, you can add filter to you ILoggingBuilder in Program.cs.
So, it can look like:
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();
Upvotes: 77
Reputation: 525
You want to change your Serilog configuration to set the minimum level for the Microsoft.EntityFrameworkCore.Storage.IRelationalCommandBuilderFactory
context to Warning
or higher.
You can find the context you need to change by setting the output template to something like [{Timestamp:HH:mm:ss} {SourceContext} [{Level}] {Message}{NewLine}{Exception}
. Once you know the context you can set the template back to how it was before.
Upvotes: 8