vmg
vmg

Reputation: 10566

Suppress SQL Queries logging in Entity Framework core

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

Answers (10)

MahmoudVahedim
MahmoudVahedim

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

Nayana Adassuriya
Nayana Adassuriya

Reputation: 24766

1.First I have installed these two Nuget packages.

enter image description here

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

enter image description here

Upvotes: 0

Jeroen Landheer
Jeroen Landheer

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

Alisson
Alisson

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

Mohammad Anas
Mohammad Anas

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

Michael Ushakov
Michael Ushakov

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

Santiago Robledo
Santiago Robledo

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

Mordechai
Mordechai

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

lambidu
lambidu

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

mdonoughe
mdonoughe

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

Related Questions