8000 Add IHostApplicationBuilder support (#780) · NLog/NLog.Extensions.Logging@909404c · GitHub
[go: up one dir, main page]

Skip to content

Commit 909404c

Browse files
mikezwwei.zhao
and
wei.zhao
authored
Add IHostApplicationBuilder support (#780)
Co-authored-by: wei.zhao <wei.zhao@bbkco.com.cn>
1 parent 165b24f commit 909404c

File tree

2 files changed

+157
-1
lines changed

2 files changed

+157
-1
lines changed

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

Lines changed: 27 additions & 1 deletion
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+
#if NET8_0_OR_GREATER
49+
/// <summary>
50+
/// Enable NLog as logging provider for Microsoft Extension Logging
51+
/// </summary>
52+
/// <param name="builder"></param>
53+
/// <returns>IHostApplicationBuilder for chaining</returns>
54+
public static IHostApplicationBuilder UseNLog(this IHostApplicationBuilder builder)
55+
{
56+
Guard.ThrowIfNull(builder);
57+
return builder.UseNLog(null);
58+
}
59+
60+
/// <summary>
61+
/// Enable NLog as logging provider for Microsoft Extension Logging
62+
/// </summary>
63+
/// <param name="builder"></param>
64+
/// <param name="options">NLogProviderOptions object to configure NLog behavior</param>
65+
/// <returns>IHostApplicationBuilder for chaining</returns>
66+
public static IHostApplicationBuilder UseNLog(this IHostApplicationBuilder builder, NLogProviderOptions options)
67+
{
68+
Guard.ThrowIfNull(builder);
69+
builder.Services.TryAddNLogLoggingProvider((svc, addlogging) => svc.AddLogging(addlogging), builder.Configuration, options, (provider, cfg, opt) => CreateNLogLoggerProvider(provider, cfg, builder.Environment, opt));
70+
return builder;
71+
}
72+
#endif
73+
4874
private static void AddNLogLoggerProvider(IServiceCollection services, IConfiguration hostConfiguration, IHostEnvironment hostEnvironment, NLogProviderOptions options, Func<IServiceProvider, IConfiguration, IHostEnvironment, NLogProviderOptions, NLogLoggerProvider> factory)
4975
{
5076
services.TryAddNLogLoggingProvider((svc, addlogging) => svc.AddLogging(addlogging), hostConfiguration, options, (provider, cfg, opt) => factory(provider, cfg, hostEnvironment, opt));
@@ -73,7 +99,7 @@ private static NLogLoggerProvider CreateNLogLoggerProvider(IServiceProvider serv
7399
{
74100
provider.LogFactory.Setup().LoadConfigurationFromFile(nlogConfigFile, optional: true);
75101
}
76-
102+
77103
provider.LogFactory.Setup().SetupLogFactory(ext => ext.AddCallSiteHiddenAssembly(typeof(ConfigureExtensions).Assembly));
78104
return provider;
79105
}

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

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,136 @@ public void UseNLog_LoadConfigurationFromSection()
128128

129129
Assert.Single(logged);
130130
Assert.Equal("logger1|error1|Memory", logged[0]);
131+
//Reset
132+
LogManager.Configuration = null;
131133
}
134+
135+
#if NET8_0_OR_GREATER
136+
[Fact]
137+
public void IHostApplicationBuilder_UseNLog_ArgumentNullException()
138+
{
139+
IHostApplicationBuilder hostBuilder = null;
140+
var argNulLException = Assert.Throws<ArgumentNullException>(() => hostBuilder.UseNLog());
141+
Assert.Equal("builder", argNulLException.ParamName);
142+
}
143+
144+
[Fact]
145+
public void IHostApplicationBuilder_UseNLog_noParams_WorksWithNLog()
146+
{
147+
var builder = new HostApplicationBuilder();
148+
builder.UseNLog();
149+
150+
var actual = builder.Build();
151+
TestHostingResult(actual, true);
152+
}
153+
154+
[Fact]
155+
public void IHostApplicationBuilder_UseNLog_withOptionsParam_WorksWithNLog()
156+
{
157+
var someParam = new NLogProviderOptions { CaptureMessageProperties = false, CaptureMessageTemplates = false };
158+
159+
var builder = new HostApplicationBuilder();
160+
builder.UseNLog(someParam);
161+
162+
var actual = builder.Build();
163+
TestHostingResult(actual, true);
164+
}
165+
166+
[Fact]
167+
public void IHostApplicationBuilder_UseNLog_withConfiguration_WorksWithNLog()
168+
{
169+
var memoryConfig = new Dictionary<string, string>();
170+
memoryConfig["NLog:CaptureMessageProperties"] = "true";
171+
memoryConfig["NLog:CaptureMessageTemplates"] = "false";
172+
memoryConfig["NLog:IgnoreScopes"] = "false";
173+
174+
var someParam = new NLogProviderOptions { CaptureMessageProperties = false, CaptureMessageTemplates = false };
175+
176+
var builder = new HostApplicationBuilder();
177+
builder.Configuration.AddInMemoryCollection(memoryConfig);
178+
builder.UseNLog(someParam);
179+
180+
var actual = builder.Build();
181+
TestHostingResult(actual, true);
182+
}
183+
184+
[Fact]
185+
public void IHostApplicationBuilder_AddNLog_withShutdownOnDispose_worksWithNLog()
186+
{
187+
var someParam = new NLogProviderOptions { ShutdownOnDispose = true };
188+
189+
var builder = new HostApplicationBuilder();
190+
builder.Logging.AddNLog(someParam);
191+
192+
var actual = builder.Build();
193+
try
194+
{
195+
TestHostingResult(actual, false);
196+
Assert.NotNull(LogManager.Configuration);
197+
}
198+
finally
199+
{
200+
actual.Dispose();
201+
Assert.Null(LogManager.Configuration);
202+
}
203+
}
204+
205+
[Fact]
206+
public void IHostApplicationBuilder_UseNLog_withAddNLog_worksWithNLog()
207+
{
208+
var builder = new HostApplicationBuilder();
209+
builder.UseNLog();
210+
builder.Logging.AddNLog();
211+
212+
var actual = builder.Build();
213+
TestHostingResult(actual, true);
214+
}
215+
216+
[Fact]
217+
public void IHostApplicationBuilder_UseNLog_ReplaceLoggerFactory()
218+
{
219+
var builder = new HostApplicationBuilder();
220+
builder.Services.AddLogging();
221+
builder.UseNLog(new NLogProviderOptions() { ReplaceLoggerFactory = true, RemoveLoggerFactoryFilter = true });
222+
223+
var actual = builder.Build();
224+
225+
var loggerFactory = actual.Services.GetService<ILoggerFactory>();
226+
227+
Assert.Equal(typeof(NLogLoggerFactory), loggerFactory.GetType());
228+
}
229+
230+
[Fact]
231+
public void IHostApplicationBuilder_UseNLog_LoadConfigurationFromSection()
232+
{
233+
var memoryConfig = new Dictionary<string, string>();
234+
memoryConfig["NLog:Rules:0:logger"] = "*";
235+
memoryConfig["NLog:Rules:0:minLevel"] = "Trace";
236+
memoryConfig["NLog:Rules:0:writeTo"] = "inMemory";
237+
memoryConfig["NLog:Targets:inMemory:type"] = "Memory";
238+
memoryConfig["NLog:Targets:inMemory:layout"] = "${logger}|${message}|${configsetting:NLog.Targets.inMemory.type}";
239+
240+
var builder = new HostApplicationBuilder();
241+
builder.Configuration.AddInMemoryCollection(memoryConfig);
242+
builder.UseNLog(new NLogProviderOptions() { LoggingConfigurationSectionName = "NLog", ReplaceLoggerFactory = true });
243+
244+
var host = builder.Build();
245+
246+
var loggerFact = host.Services.GetService<ILoggerFactory>();
247+
var logger = loggerFact.CreateLogger("logger1");
248+
249+
ConfigSettingLayoutRenderer.DefaultConfiguration = null; // See dependency resolving is working
250+
251+
logger.LogError("error1");
252+
253+
var loggerProvider = host.Services.GetService<ILoggerProvider>() as NLogLoggerProvider;
254+
var logged = loggerProvider.LogFactory.Configuration.FindTargetByName<Targets.MemoryTarget>("inMemory").Logs;
255+
256+
Assert.Single(logged);
257+
Assert.Equal("logger1|error1|Memory", logged[0]);
258+
//Reset
259+
LogManager.Configuration = null;
260+
}
261+
#endif
132262
}
133263
}

0 commit comments

Comments
 (0)
0