I have typical logging requirement for my asp.net core 2.x app:
Now I see at least three different API's to configure the logging:
WebHostBuilder.ConfigureLogging()
in Program.cs
public static void Main(string[] args) { var webHost = new WebHostBuilder() .ConfigureLogging((hostingContext, logging) => { logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging")); logging.AddConsole(); logging.AddDebug(); logging.AddAzureWebAppDiagnostics(); }) .UseStartup<Startup>() .Build(); webHost.Run(); }
Inject ILoggerFactory
to Startup.Configure method:
public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory, IServiceProvider serviceProvider) { loggerFactory.AddConsole(); loggerFactory.AddAzureWebAppDiagnostics(); loggerFactory.AddApplicationInsights(app.ApplicationServices, (category, level) => level >= (category == "Microsoft" ? LogLevel.Error : LogLevel.Information)); }
in Startup.ConfigureServices:
public void ConfigureServices(IServiceCollection services) { services.AddLogging(logging => { logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging")); logging.AddConsole(); logging.AddDebug(); logging.AddAzureWebAppDiagnostics(); } }
What is the difference between those? When to use which?
AddLogging(IServiceCollection) Adds logging services to the specified IServiceCollection. AddLogging(IServiceCollection, Action<ILoggingBuilder>) Adds logging services to the specified IServiceCollection.
Registers a wrapper logger which provides a common way to filter log messages across all registered ILoggerProviders. CreateLogger(ILoggerFactory, Type) Creates a new ILogger instance using the full name of the given type . CreateLogger<T>(ILoggerFactory)
In ASP.NET Core, logging providers store the logs. You can configure multiple logging providers for your application. The default ASP.NET Core configures the following logging providers: Console, Debug, EventSource, and EventLog (on Windows).
The third one use ConfigureServices
which is a public method in the WebHostBuilder
. And the first one use ConfigureLogging
which is one of IHostBuilder
's extension method in HostingHostBuilderExtensions
.
And they both call the IServiceCollection
's extension method AddLogging
in LoggingServiceCollectionExtensions
under Microsoft.Extensions.Logging
package. The AddLogging
method first try to add two singleton ILoggerFactory
and ILogger<>
and an enumerable of LoggerFilterOptions
. Then do the action for logging(ILoggingBuilder
) which finally calls AddProvider
method to add the log providers implemented by these providers(Console, Azure) and calls SetMinimumLevel
to add LoggerFilterOptions
The second method directly adds the log providers to LoggerFactory
. And these providers are called in LoggerFactory
when logging methods are called.
As for orders, the second and third methods are called by WebHostBuilder
's UseStartup<TStartup>
method.
In ASP.NET Core 3.x, the first example is now the endorsed option. As explained by the documentation
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureLogging(logging => { logging.ClearProviders(); logging.AddConsole(); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
Another change is that writing logs before completion of the DI container setup in the Startup.ConfigureServices method is no longer supported:
Logging during the host construction is also not supported (since the DI container is not yet set up), the documentation advises to create a separate logger for that case.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With