问题
I have typical logging requirement for my asp.net core 2.x app:
- use application insight in production,
- console and debug logger in development env
- setup some filters based on category and log level
Now I see at least three different API's to configure the logging:
WebHostBuilder.ConfigureLogging()
in Program.cspublic 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?
回答1:
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.
来源:https://stackoverflow.com/questions/50744024/iloggerfactory-vs-servicecollection-addlogging-vs-webhostbuilder-configureloggin