After deploying a new application to production, we noticed that a lot of extra log messages where written to the EventLog. As we didn't configure the EventLog logging provider in our application, we did not expect this. Turns out that when you create a new ASP.NET Core application with WebApplication.CreateBuilder, you get a set of logging providers activated out-of-the-box.
So the question becomes: which providers are enabled, and how do you get rid of the ones you don’t need?
Which providers are enabled by default?
The default builder registers the following providers:
- Console
- Debug
- EventSource
- EventLog (Windows only)
You can verify this yourself by looking at the registered ILoggerProvider services:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
var providers = app.Services.GetServices<ILoggerProvider>();
foreach (var provider in providers)
{
Console.WriteLine(provider.GetType().Name);
}
On Windows this prints something like:
ConsoleLoggerProvider
DebugLoggerProvider
EventSourceLoggerProvider
EventLogLoggerProvider
The code-based approach
The obvious way is to start from a clean slate and add back only what you need:
var builder = WebApplication.CreateBuilder(args);
builder.Logging.ClearProviders();
builder.Logging.AddConsole();
This works, but it’s hardcoded. If you want to change behavior per environment without a new deployment, you need something else.
The configuration-based approach
The logging configuration is read from the Logging section in appsettings.json. Next to the general LogLevel section, you can add a section per provider, using the provider name as the key:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
},
"Debug": {
"LogLevel": {
"Default": "None"
}
},
"EventSource": {
"LogLevel": {
"Default": "None"
}
},
"Console": {
"LogLevel": {
"Default": "Warning"
}
}
}
}
What did we do here?
- Debug and EventSource are set to
None, so they no longer log anything. - Console keeps running, but only for
Warningand above. - Every other provider falls back to the general
LogLevelsection.
Remark: Setting the level to None doesn’t remove the provider. It is still registered, but it filters out every message. If you want it gone completely, use ClearProviders().
Once a provider has its own LogLevel section, the general Logging:LogLevel rules are no longer applied to that provider. In the example above, the Microsoft.AspNetCore: Warning rule has no effect on the Console provider. If you still want it there, repeat it:
"Console": {
"LogLevel": {
"Default": "Warning",
"Microsoft.AspNetCore": "Warning"
}
}
Changing it without touching the code
Because this is plain configuration, you can also override it with environment variables. Use a double underscore as the separator:
Logging__Debug__LogLevel__Default=None
Logging__Console__LogLevel__Default=Warning
This is handy in Azure Container Apps or Kubernetes, where you can change the log level of a single provider without rebuilding your image.
Tip: Provider names are case-insensitive, but they have to match the provider alias: Console, Debug, EventSource and EventLog. A typo is silently ignored, so if nothing changes, check the spelling first.
