How do I turn off the logging done by ASP.NET for each request e.g.
INFO 09:38:41 User profile is available. Using 'C:\Users\xxxx xxxx\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest.
DEBUG 09:38:41 Hosting starting
DEBUG 09:38:41 Hosting started
INFO 09:38:41 Request starting HTTP/1.1 GET http://localhost:23369/
INFO 09:38:41 Request starting HTTP/1.1 DEBUG http://localhost:23369/ text/html DEBUG 09:38:41 DEBUG requests are not supported
DEBUG 09:38:41 The request path / does not match a supported file type
DEBUG 09:38:41 Request successfully matched the route with name 'default' and template '{controller=Home}/{action=Index}/{id?}'. DEBUG 09:38:41 Request successfully matched the route with name 'default' and template '{controller=Home}/{action=Index}/{id?}'. DEBUG 09:38:41 Executing action Forums.Controllers.HomeController.Index
DEBUG 09:38:41 Executing action Forums.Controllers.HomeController.Index
INFO 09:38:41 Executing action method Forums.Controllers.HomeController.Index with arguments () - ModelState is Valid'
INFO 09:38:41 Executing action method Forums.Controllers.HomeController.Index
..
I couldn't find yet how I can turn this logging off...
This is my Configure
method in the Startup
class:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddProvider(new Log4NetProvider());
if (env.IsDevelopment())
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
// For more details on creating database during deployment see http://go.microsoft.com/fwlink/?LinkID=615859
try
{
using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>()
.CreateScope())
{
serviceScope.ServiceProvider.GetService<ApplicationDbContext>()
.Database.Migrate();
}
}
catch { }
}
app.UseIISPlatformHandler(options => options.AuthenticationDescriptions.Clear());
app.UseStaticFiles();
app.UseIdentity();
// To configure external authentication please see http://go.microsoft.com/fwlink/?LinkID=532715
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
And this is my project.json file:
"dependencies": {
"EntityFramework.Commands": "7.0.0-rc1-final",
"EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final",
"log4net": "2.0.5",
"Microsoft.AspNet.Authentication.Cookies": "1.0.0-rc1-final",
"Microsoft.AspNet.Diagnostics.Entity": "7.0.0-rc1-final",
"Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final",
"Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
"Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
"Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-rc1-final",
"Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
"Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final",
"Microsoft.AspNet.Tooling.Razor": "1.0.0-rc1-final",
"Microsoft.Extensions.CodeGenerators.Mvc": "1.0.0-rc1-final",
"Microsoft.Extensions.Configuration.FileProviderExtensions": "1.0.0-rc1-final",
"Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final",
"Microsoft.Extensions.Configuration.UserSecrets": "1.0.0-rc1-final",
"Microsoft.Extensions.Logging": "1.0.0-rc1-final",
"Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-rc1-final"
},
"commands": {
"web": "Microsoft.AspNet.Server.Kestrel",
"ef": "EntityFramework.Commands"
},
"frameworks": {
"dnx451": { }
},
Update:
My log4net provider was taken from here
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", ...)
)To
Or the same modification via environment variables (assumes
.AddEnvironmentVariables()
)You can also be more specific, the following reduces most entries but leaves
Microsoft.AspNetCore.Hosting.Internal.WebHost
atInformation
.Appologies if this doesn't work for
log4net
In and before ASP.NET 5 RC1 (now ASP.NET Core 1.0), you could do it via the logger factory, i.e.
However, with the current branch (not released yet, but available via nightly builds), this has been removed. Now you need to pass the
LogLevel
per provider. Typically this is done via extension method.For the built in console logger, it would be
loggerFactory.AddConsole(minimumLevel: LogLevel.Warning);
for example.Since your logger provider is a custom one, you will have to configure it yourself. Take a look on how the console logger does it. It passes a delegate to the provider, that does the filtering.
From GitHub Source:
Of course instead of passing a delegate you can also directly set the log level of log4net.
Update: To extend on what I've pointed out in the comments
The
ILoggerProvider
is only a wrapper around the actual logging framework. In the simple case ofConsoleLoggerProvider
, there is no framework as all behind it, just a simpleConsole.WriteLine
call.In case of log4net, it's obvious from the example that logging can be enabled on a per level basis. This isn't possible with the .NET Core logger abstraction liked above, as the abstraction doesn't do any filtering.
In a log4net
ILoggerProvider
one would simply route all log levels to the log4net net library and have it filter it.Based on the linked GitHub issue @haim770 created, you have the SourceContext for filtering and if log4net doesn't have a concept of SourceContext, you'll have to implement this in the provider. If it has a concept of SourceContext, then the provider needs to reroute/translate it into the structure log4net expects it.
As you can see, the logger itself always stays unaware about internal specifics and implementation details of ASP.NET. The
Log4NetProvider
can't and shouldn't, because it's task is to translate/wrap around that api. Providers are just abstractions, so we don't have to leak implementation details into a library for example.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:
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:And the
Log4NetAspExtensions
:Possible usage (in
Startup.cs
):Setting Logging.LogLevel in
appsettings.json
for the keyMicrosoft
was not enough. I had to specifically set the following keys specifically, e.g.:But as an alternative using a key with a wildcard, e.g.
Microsoft.*
, worked. So I ended up with:What have really worked for me was adding this in ASP.NET Core 2.0 project's
Startup.cs
file: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