Skip to content

Commit e9c0988

Browse files
authored
UseNLog supporting isolated LogFactory (#782)
1 parent 909404c commit e9c0988

File tree

2 files changed

+94
-2
lines changed

2 files changed

+94
-2
lines changed

src/NLog.Extensions.Hosting/Extensions/ConfigureExtensions.cs

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,32 @@ public static IHostBuilder UseNLog(this IHostBuilder builder, NLogProviderOption
4545
return builder;
4646
}
4747

48+
/// <summary>
49+
/// Enable NLog as logging provider for Microsoft Extension Logging
50+
/// </summary>
51+
/// <param name="builder"></param>
52+
/// <param name="options">NLogProviderOptions object to configure NLog behavior</param>
53+
/// <param name="factoryBuilder">Initialize NLog LogFactory with NLog LoggingConfiguration.</param>
54+
/// <returns>IHostBuilder for chaining</returns>
55+
public static IHostBuilder UseNLog(this IHostBuilder builder, NLogProviderOptions options, Func<IServiceProvider, LogFactory> factoryBuilder)
56+
{
57+
Guard.ThrowIfNull(builder);
58+
#if NETSTANDARD2_0
59+
builder.ConfigureServices((builderContext, services) => AddNLogLoggerProvider(services, builderContext.Configuration, null, options, (serviceProvider, config, hostEnv, opt) =>
60+
#else
61+
builder.ConfigureServices((builderContext, services) => AddNLogLoggerProvider(services, builderContext.Configuration, builderContext.HostingEnvironment, options, (serviceProvider, config, hostEnv, opt) =>
62+
#endif
63+
{
64+
config = serviceProvider.SetupNLogConfigSettings(config, LogManager.LogFactory);
65+
66+
// Delay initialization of targets until we have loaded config-settings
67+
var logFactory = factoryBuilder(serviceProvider);
68+
var provider = CreateNLogLoggerProvider(serviceProvider, config, hostEnv, opt, logFactory);
69+
return provider;
70+
}));
71+
return builder;
72+
}
73+
4874
#if NET8_0_OR_GREATER
4975
/// <summary>
5076
/// Enable NLog as logging provider for Microsoft Extension Logging
@@ -66,7 +92,29 @@ public static IHostApplicationBuilder UseNLog(this IHostApplicationBuilder build
6692
public static IHostApplicationBuilder UseNLog(this IHostApplicationBuilder builder, NLogProviderOptions options)
6793
{
6894
Guard.ThrowIfNull(builder);
69-
builder.Services.TryAddNLogLoggingProvider((svc, addlogging) => svc.AddLogging(addlogging), builder.Configuration, options, (provider, cfg, opt) => CreateNLogLoggerProvider(provider, cfg, builder.Environment, opt));
95+
builder.Services.TryAddNLogLoggingProvider((svc, addlogging) => svc.AddLogging(addlogging), builder.Configuration, options, (serviceProvider, config, opt) => CreateNLogLoggerProvider(serviceProvider, config, builder.Environment, opt));
96+
return builder;
97+
}
98+
99+
/// <summary>
100+
/// Enable NLog as logging provider for Microsoft Extension Logging
101+
/// </summary>
102+
/// <param name="builder"></param>
103+
/// <param name="options">NLogProviderOptions object to configure NLog behavior</param>
104+
/// <param name="factoryBuilder">Initialize NLog LogFactory with NLog LoggingConfiguration.</param>
105+
/// <returns>IHostApplicationBuilder for chaining</returns>
106+
public static IHostApplicationBuilder UseNLog(this IHostApplicationBuilder builder, NLogProviderOptions options, Func<IServiceProvider, LogFactory> factoryBuilder)
107+
{
108+
Guard.ThrowIfNull(builder);
109+
builder.Services.TryAddNLogLoggingProvider((svc, addlogging) => svc.AddLogging(addlogging), builder.Configuration, options, (serviceProvider, config, opt) =>
110+
{
111+
config = serviceProvider.SetupNLogConfigSettings(config, LogManager.LogFactory);
112+
113+
// Delay initialization of targets until we have loaded config-settings
114+
var logFactory = factoryBuilder(serviceProvider);
115+
var provider = CreateNLogLoggerProvider(serviceProvider, config, builder.Environment, opt, logFactory);
116+
return provider;
117+
});
70118
return builder;
71119
}
72120
#endif
@@ -78,7 +126,12 @@ private static void AddNLogLoggerProvider(IServiceCollection services, IConfigur
78126

79127
private static NLogLoggerProvider CreateNLogLoggerProvider(IServiceProvider serviceProvider, IConfiguration hostConfiguration, IHostEnvironment hostEnvironment, NLogProviderOptions options)
80128
{
81-
NLogLoggerProvider provider = serviceProvider.CreateNLogLoggerProvider(hostConfiguration, options, null);
129+
return serviceProvider.CreateNLogLoggerProvider(hostConfiguration, options, LogManager.LogFactory);
130+
}
131+
132+
private static NLogLoggerProvider CreateNLogLoggerProvider(IServiceProvider serviceProvider, IConfiguration hostConfiguration, IHostEnvironment hostEnvironment, NLogProviderOptions options, LogFactory logFactory)
133+
{
134+
NLogLoggerProvider provider = serviceProvider.CreateNLogLoggerProvider(hostConfiguration, options, logFactory);
82135

83136
string nlogConfigFile = string.Empty;
84137
string contentRootPath = hostEnvironment?.ContentRootPath;

test/NLog.Extensions.Hosting.Tests/ExtensionMethodTests.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,24 @@ public void UseNLog_withOptionsParam_WorksWithNLog()
3434
TestHostingResult(actual, true);
3535
}
3636

37+
[Fact]
38+
public void UseNLog_ShouldLogToNLog()
39+
{
40+
var nlogTarget = new Targets.MemoryTarget() { Name = "Output" };
41+
var builder = new HostBuilder().UseNLog(null, (serviceProvider) =>
42+
{
43+
var nLogFactory = new LogFactory().Setup().LoadConfiguration(c => c.ForLogger().WriteTo(nlogTarget)).LogFactory;
44+
return nLogFactory;
45+
});
46+
47+
var loggerFactory = builder.Build().Services.GetService<ILoggerFactory>();
48+
Assert.NotNull(loggerFactory);
49+
50+
var logger = loggerFactory.CreateLogger("Hello");
51+
logger.LogCritical("World");
52+
Assert.Single(nlogTarget.Logs);
53+
}
54+
3755
[Fact]
3856
public void UseNLog_withConfiguration_WorksWithNLog()
3957
{
@@ -258,6 +276,27 @@ public void IHostApplicationBuilder_UseNLog_LoadConfigurationFromSection()
258276
//Reset
259277
LogManager.Configuration = null;
260278
}
279+
280+
[Fact]
281+
public void IHostApplicationBuilder_UseNLog_ShouldLogToNLog()
282+
{
283+
var nlogTarget = new Targets.MemoryTarget() { Name = "Output" };
284+
var builder = new HostApplicationBuilder();
285+
builder.UseNLog(null, (ServiceProvider) =>
286+
{
287+
var nLogFactory = new LogFactory().Setup().LoadConfiguration(c => c.ForLogger().WriteTo(nlogTarget)).LogFactory;
288+
return nLogFactory;
289+
});
290+
291+
var actual = builder.Build();
292+
293+
var loggerFactory = actual.Services.GetService<ILoggerFactory>();
294+
Assert.NotNull(loggerFactory);
295+
296+
var logger = loggerFactory.CreateLogger("Hello");
297+
logger.LogCritical("World");
298+
Assert.Single(nlogTarget.Logs);
299+
}
261300
#endif
262301
}
263302
}

0 commit comments

Comments
 (0)