diff --git a/src/Microsoft.AspNetCore.Hosting.Abstractions/IWebHostBuilder.cs b/src/Microsoft.AspNetCore.Hosting.Abstractions/IWebHostBuilder.cs index 20ce1700..aa40a362 100644 --- a/src/Microsoft.AspNetCore.Hosting.Abstractions/IWebHostBuilder.cs +++ b/src/Microsoft.AspNetCore.Hosting.Abstractions/IWebHostBuilder.cs @@ -5,6 +5,7 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting.Server; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; namespace Microsoft.AspNetCore.Hosting { @@ -18,6 +19,13 @@ public interface IWebHostBuilder /// IWebHost Build(); + /// + /// Specify the to be used by the web host. + /// + /// The to be used. + /// The . + IWebHostBuilder UseLoggerFactory(ILoggerFactory loggerFactory); + /// /// Specify the to be used by the web host. /// @@ -46,6 +54,13 @@ public interface IWebHostBuilder /// The . IWebHostBuilder Configure(Action configureApplication); + /// + /// Adds a delegate for configuring the provided . This may be called multiple times. + /// + /// The delegate that configures the . + /// The . + IWebHostBuilder ConfigureLogging(Action configureLogging); + /// /// Add or replace a setting in the configuration. /// diff --git a/src/Microsoft.AspNetCore.Hosting.Abstractions/project.json b/src/Microsoft.AspNetCore.Hosting.Abstractions/project.json index df67e004..56bc1901 100644 --- a/src/Microsoft.AspNetCore.Hosting.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Hosting.Abstractions/project.json @@ -18,7 +18,8 @@ "Microsoft.AspNetCore.Hosting.Server.Abstractions": "1.0.0-*", "Microsoft.Extensions.Configuration.Abstractions": "1.0.0-*", "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0-*", - "Microsoft.Extensions.FileProviders.Abstractions": "1.0.0-*" + "Microsoft.Extensions.FileProviders.Abstractions": "1.0.0-*", + "Microsoft.Extensions.Logging.Abstractions": "1.0.0-*" }, "frameworks": { "net451": {}, diff --git a/src/Microsoft.AspNetCore.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNetCore.Hosting/WebHostBuilder.cs index 90e89a96..be17d048 100644 --- a/src/Microsoft.AspNetCore.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNetCore.Hosting/WebHostBuilder.cs @@ -27,10 +27,11 @@ namespace Microsoft.AspNetCore.Hosting public class WebHostBuilder : IWebHostBuilder { private readonly IHostingEnvironment _hostingEnvironment; - private readonly ILoggerFactory _loggerFactory; private readonly List> _configureServicesDelegates; + private readonly List> _configureLoggingDelegates; private IConfiguration _config = new ConfigurationBuilder().AddInMemoryCollection().Build(); + private ILoggerFactory _loggerFactory; private WebHostOptions _options; // Only one of these should be set @@ -40,11 +41,14 @@ public class WebHostBuilder : IWebHostBuilder // Only one of these should be set private IServerFactory _serverFactory; + /// + /// Initializes a new instance of the class. + /// public WebHostBuilder() { _hostingEnvironment = new HostingEnvironment(); - _loggerFactory = new LoggerFactory(); _configureServicesDelegates = new List>(); + _configureLoggingDelegates = new List>(); } /// @@ -69,6 +73,22 @@ public string GetSetting(string key) return _config[key]; } + /// + /// Specify the to be used by the web host. + /// + /// The to be used. + /// The . + public IWebHostBuilder UseLoggerFactory(ILoggerFactory loggerFactory) + { + if (loggerFactory == null) + { + throw new ArgumentNullException(nameof(loggerFactory)); + } + + _loggerFactory = loggerFactory; + return this; + } + /// /// Specify the to be used by the web host. /// @@ -135,13 +155,18 @@ public IWebHostBuilder Configure(Action configureApp) } /// - /// Configure the provided which will be available as a hosting service. + /// Adds a delegate for configuring the provided . This may be called multiple times. /// /// The delegate that configures the . /// The . public IWebHostBuilder ConfigureLogging(Action configureLogging) { - configureLogging(_loggerFactory); + if (configureLogging == null) + { + throw new ArgumentNullException(nameof(configureLogging)); + } + + _configureLoggingDelegates.Add(configureLogging); return this; } @@ -184,14 +209,25 @@ private IServiceCollection BuildHostingServices() var services = new ServiceCollection(); services.AddSingleton(_hostingEnvironment); + + if (_loggerFactory == null) + { + _loggerFactory = new LoggerFactory(); + } + + foreach (var configureLogging in _configureLoggingDelegates) + { + configureLogging(_loggerFactory); + } + services.AddSingleton(_loggerFactory); + services.AddLogging(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddLogging(); services.AddOptions(); var diagnosticSource = new DiagnosticListener("Microsoft.AspNetCore"); diff --git a/test/Microsoft.AspNetCore.Hosting.Tests/WebHostBuilderTests.cs b/test/Microsoft.AspNetCore.Hosting.Tests/WebHostBuilderTests.cs index 026fcf98..0571ebe9 100644 --- a/test/Microsoft.AspNetCore.Hosting.Tests/WebHostBuilderTests.cs +++ b/test/Microsoft.AspNetCore.Hosting.Tests/WebHostBuilderTests.cs @@ -13,6 +13,7 @@ using Microsoft.AspNetCore.Http.Internal; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.PlatformAbstractions; using System.Reflection; using Xunit; @@ -124,6 +125,33 @@ public async Task StartupConfigureThrows_Fallback() } } + [Fact] + public void DefaultCreatesLoggerFactory() + { + var hostBuilder = new WebHostBuilder() + .UseServer(new TestServer()) + .UseStartup(); + + var host = (WebHost)hostBuilder.Build(); + + Assert.NotNull(host.Services.GetService()); + } + + [Fact] + public void UseLoggerFactoryHonored() + { + var loggerFactory = new LoggerFactory(); + + var hostBuilder = new WebHostBuilder() + .UseLoggerFactory(loggerFactory) + .UseServer(new TestServer()) + .UseStartup(); + + var host = (WebHost)hostBuilder.Build(); + + Assert.Same(loggerFactory, host.Services.GetService()); + } + [Fact] public void DefaultConfigurationCapturesStartupErrors() {