How to turn off the logging done by the ASP.NET core framework
I'm not sure if I am missing something but don't you just want to raise the log level for the Microsoft logs?
Edit appsettings.json
(assumes .AddJsonFile("appsettings.json", ...)
)
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Trace",
"System": "Information",
"Microsoft": "Information"
To
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Trace",
"System": "Information",
"Microsoft": "None"
Or the same modification via environment variables (assumes .AddEnvironmentVariables()
)
Logging:LogLevel:Microsoft=None
You can also be more specific, the following reduces most entries but leaves Microsoft.AspNetCore.Hosting.Internal.WebHost
at Information
.
"Microsoft": "Information",
"Microsoft.AspNetCore.Mvc.Internal": "Warning",
"Microsoft.AspNetCore.Authentication": "Warning"
Appologies if this doesn't work for log4net
What have really worked for me was adding this in ASP.NET Core 2.0 project's Startup.cs
file:
using Microsoft.Extensions.Logging;
public void ConfigureServices(IServiceCollection services)
{
.
.
.
services.AddLogging(
builder =>
{
builder.AddFilter("Microsoft", LogLevel.Warning)
.AddFilter("System", LogLevel.Warning)
.AddFilter("NToastNotify", LogLevel.Warning)
.AddConsole();
});
}
This way you'll only get Warning level logs for logging info starting with the filters passed to builder.AddFilter
.
My log4net.log file now doesn't show that huge amount of INFO
logging spit by Microsoft and others.
More info here @ Microsoft Docs: Log filtering
If you're using Serilog to do your .NET Core logging, you can update your appsettings.json file to set the log levels like so:
"Serilog": {
"MinimumLevel": {
"Default": "Verbose",
"Override": {
"Microsoft": "Error",
"System": "Error"
}
},
"Properties": {
"Application": "your-app"
}
}
This allows you to only log errors from System/Microsoft while logging everything else as you'd like.
Since the new logging infrastructure is being used (by design) by asp.net itself (as well as other vendor code), it's up to the ILoggerProvider
implementation to decide whether it wants to log that source or not.
Here's a revised implementation for log4net
that adds a basic source filtering:
public class Log4NetProvider : ILoggerProvider
{
private static readonly NoopLogger _noopLogger = new NoopLogger();
private readonly Func<string, bool> _sourceFilterFunc;
private readonly ConcurrentDictionary<string, Log4NetLogger> _loggers = new ConcurrentDictionary<string, Log4NetLogger>();
public Log4NetProvider(Func<string, bool> sourceFilterFunc = null)
{
_sourceFilterFunc = sourceFilterFunc != null ? sourceFilterFunc : x => true;
}
public ILogger CreateLogger(string name)
{
if (!_sourceFilterFunc(name))
return _noopLogger;
return _loggers.GetOrAdd(name, x => new Log4NetLogger(name));
}
public void Dispose()
{
_loggers.Clear();
}
private class NoopLogger : ILogger
{
public IDisposable BeginScopeImpl(object state)
{
return null;
}
public bool IsEnabled(LogLevel logLevel)
{
return false;
}
public void Log(LogLevel logLevel, int eventId, object state, Exception exception, Func<object, Exception, string> formatter)
{
}
}
}
And the Log4NetAspExtensions
:
public static void ConfigureLog4Net(this IApplicationEnvironment appEnv, string configFileRelativePath)
{
GlobalContext.Properties["appRoot"] = appEnv.ApplicationBasePath;
XmlConfigurator.Configure(new FileInfo(Path.Combine(appEnv.ApplicationBasePath, configFileRelativePath)));
}
public static void AddLog4Net(this ILoggerFactory loggerFactory, Func<string, bool> sourceFilterFunc = null)
{
loggerFactory.AddProvider(new Log4NetProvider(sourceFilterFunc));
}
public static void AddLog4Net(this ILoggerFactory loggerFactory)
{
loggerFactory.AddLog4Net(null);
}
Possible usage (in Startup.cs
):
public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv, ILoggerFactory loggerFactory)
{
appEnv.ConfigureLog4Net("log4net.xml");
loggerFactory.AddLog4Net(x => !x.StartsWith("Microsoft."));
}
In ASP.NET Core version 3, you can clear the existing log providers in the ConfigureServices function:
public void ConfigureServices(IServiceCollection services) {
//Do everything else...
services.AddLogging(c => c.ClearProviders());
}