78

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)

Gert Arnold
  • 105,341
  • 31
  • 202
  • 291
vmg
  • 9,920
  • 13
  • 61
  • 90

8 Answers8

72

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();
lambidu
  • 1,038
  • 10
  • 19
60

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" ]
  }
Santiago Robledo
  • 1,202
  • 12
  • 9
  • 1
    Is there possibility to specify this ```MinimumLevel.Override("Microsoft.EntityFrameworkCore.Database.Command"``` thing in appsettings file? – Akmal Salikhov Mar 25 '20 at 07:35
  • 2
    Hi @AkmalSalikhov, please check my edited answer. Regards. – Santiago Robledo Apr 03 '20 at 15:24
  • "Microsoft.EntityFrameworkCore.Model": "Warning" Did it for me. You can see in the logs what you need to override. – Per G Jun 29 '21 at 18:56
  • This should not be needed. You already set the `Microsoft` prefix to warning. That should include `Microsoft.EntityFrameworkCore.Database.Command`. – Jonathan Wood Aug 29 '23 at 18:08
54

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"
    }
  }
Michael Ushakov
  • 1,639
  • 1
  • 10
  • 18
16

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.

Mordechai
  • 15,437
  • 2
  • 41
  • 82
8

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.

mdonoughe
  • 515
  • 5
  • 12
  • I've managed to exclude the context/source completely: `.Filter.ByExcluding(Matching.FromSource("Microsoft.EntityFrameworkCore.Storage.IRelationalCommandBuilderFactory"))` but don't know how to set minimum level – Andrzej Martyna Nov 09 '17 at 08:53
  • 1
    If you're doing your configuration from code, you should be able to do something like `new LoggerConfiguration().MinimumLevel.Information().MinimumLevel.Override("Microsoft.EntityFrameworkCore.Storage.IRelationalCommandBuilderFactory", LogEventLevel.Warning)`? I usually configure this from Serilog.Settings.Configuration JSON: `{"Serilog": {"MinimumLevel": {"Default": "Information", "Override": {"Microsoft.EntityFrameworkCore.Storage.IRelationalCommandBuilderFactory": "Warning"}}}}` – mdonoughe Nov 10 '17 at 23:46
  • Those details added much practical value to the answer. I've tried it from code and it works. Thanks! I will try JSON config later and for sure it is preferred way as you have external control on logging options. – Andrzej Martyna Nov 13 '17 at 09:29
  • One very strange thing is that copy-pasted code didn't worked till I've found that there are some invisible characters in the string literal (I had to type it by hand to work; I think it is stack overflow issue?). – Andrzej Martyna Nov 13 '17 at 09:31
0

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)
0

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);

Alisson
  • 1
  • 2
0

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());
Jeroen Landheer
  • 9,160
  • 2
  • 36
  • 43