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()
{