Skip to content

Commit 02852f9

Browse files
authored
NLogProviderOptions - Added LoggingConfigurationSectionName (#501)
1 parent a693ce1 commit 02852f9

5 files changed

Lines changed: 69 additions & 8 deletions

File tree

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22
using System.Reflection;
33
using Microsoft.Extensions.Configuration;
44
using Microsoft.Extensions.DependencyInjection;
5-
using Microsoft.Extensions.DependencyInjection.Extensions;
65
using Microsoft.Extensions.Hosting;
7-
using Microsoft.Extensions.Logging;
86
using NLog.Config;
97
using NLog.Extensions.Logging;
108

@@ -52,9 +50,14 @@ private static NLogLoggerProvider CreateNLogLoggerProvider(IServiceProvider serv
5250
{
5351
configuration = SetupConfiguration(serviceProvider, configuration);
5452
NLogLoggerProvider provider = new NLogLoggerProvider(options);
55-
if (configuration != null && options == null)
53+
if (configuration != null)
5654
{
57-
provider.Configure(configuration.GetSection("Logging:NLog"));
55+
if (options == null)
56+
{
57+
provider.Configure(configuration.GetSection("Logging:NLog"));
58+
}
59+
60+
provider.TryLoadConfigurationFromSection(configuration);
5861
}
5962
return provider;
6063
}

src/NLog.Extensions.Logging/Extensions/ConfigureExtensions.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,10 +250,16 @@ private static NLogLoggerProvider CreateNLogLoggerProvider(IServiceProvider serv
250250
{
251251
NLogLoggerProvider provider = new NLogLoggerProvider(options ?? NLogProviderOptions.Default, logFactory ?? LogManager.LogFactory);
252252
configuration = SetupConfiguration(serviceProvider, configuration);
253-
if (configuration != null && options == null)
253+
if (configuration != null)
254254
{
255-
provider.Configure(configuration.GetSection("Logging:NLog"));
255+
if (options == null)
256+
{
257+
provider.Configure(configuration.GetSection("Logging:NLog"));
258+
}
259+
260+
provider.TryLoadConfigurationFromSection(configuration);
256261
}
262+
257263
return provider;
258264
}
259265

src/NLog.Extensions.Logging/Internal/RegisterNLogLoggingProvider.cs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
namespace NLog.Extensions.Logging
22
{
3-
#if !NETCORE1_0
43
using System;
4+
using System.Linq;
55
using Microsoft.Extensions.Configuration;
6+
#if !NETCORE1_0
67
using Microsoft.Extensions.DependencyInjection;
78
using Microsoft.Extensions.DependencyInjection.Extensions;
89
using Microsoft.Extensions.Logging;
10+
#endif
911

1012
internal static class RegisterNLogLoggingProvider
1113
{
14+
#if !NETCORE1_0
1215
internal static void TryAddNLogLoggingProvider(this IServiceCollection services, Action<IServiceCollection, Action<ILoggingBuilder>> addLogging, IConfiguration configuration, NLogProviderOptions options, Func<IServiceProvider, IConfiguration, NLogProviderOptions, NLogLoggerProvider> factory)
1316
{
1417
var sharedFactory = factory;
@@ -30,6 +33,24 @@ internal static void TryAddNLogLoggingProvider(this IServiceCollection services,
3033
addLogging?.Invoke(services, (builder) => builder?.AddFilter<NLogLoggerProvider>(null, Microsoft.Extensions.Logging.LogLevel.Trace));
3134
}
3235
}
33-
}
3436
#endif
37+
38+
internal static void TryLoadConfigurationFromSection(this NLogLoggerProvider loggerProvider, IConfiguration configuration)
39+
{
40+
if (string.IsNullOrEmpty(loggerProvider.Options.LoggingConfigurationSectionName))
41+
return;
42+
43+
var nlogConfig = configuration.GetSection(loggerProvider.Options.LoggingConfigurationSectionName);
44+
if (nlogConfig?.GetChildren()?.Any() == true)
45+
{
46+
loggerProvider.LogFactory.Setup().LoadConfiguration(configBuilder =>
47+
{
48+
if (configBuilder.Configuration.LoggingRules.Count == 0 && configBuilder.Configuration.AllTargets.Count == 0)
49+
{
50+
configBuilder.Configuration = new NLogLoggingConfiguration(nlogConfig);
51+
}
52+
});
53+
}
54+
}
55+
}
3556
}

src/NLog.Extensions.Logging/Logging/NLogProviderOptions.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,12 @@ public class NLogProviderOptions
6868
/// <remarks>This option affects the building of service configuration, so assigning it from appsettings.json has no effect (loaded after).</remarks>
6969
public bool ReplaceLoggerFactory { get; set; }
7070

71+
/// <summary>
72+
/// Checks the Host Configuration for the specified section-name, and tries to load NLog-LoggingConfiguration after creation of NLogLoggerProvider
73+
/// </summary>
74+
/// <remarks>Will only attempt to load NLog-LoggingConfiguration if valid section-name, and NLog-LoggingConfiguration has not been loaded already.</remarks>
75+
public string LoggingConfigurationSectionName { get; set; }
76+
7177
/// <summary>Initializes a new instance NLogProviderOptions with default values.</summary>
7278
public NLogProviderOptions()
7379
{

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,5 +92,30 @@ public void UseNLog_ReplaceLoggerFactory()
9292

9393
Assert.Equal(typeof(NLogLoggerFactory), loggerFactory.GetType());
9494
}
95+
96+
[Fact]
97+
public void UseNLog_LoadConfigurationFromSection()
98+
{
99+
var host = new HostBuilder().ConfigureAppConfiguration((context, config) =>
100+
{
101+
var memoryConfig = new Dictionary<string, string>();
102+
memoryConfig["NLog:Rules:0:logger"] = "*";
103+
memoryConfig["NLog:Rules:0:minLevel"] = "Trace";
104+
memoryConfig["NLog:Rules:0:writeTo"] = "inMemory";
105+
memoryConfig["NLog:Targets:inMemory:type"] = "Memory";
106+
memoryConfig["NLog:Targets:inMemory:layout"] = "${logger}|${message}|${configsetting:NLog.Targets.inMemory.type}";
107+
config.AddInMemoryCollection(memoryConfig);
108+
}).UseNLog(new NLogProviderOptions() { LoggingConfigurationSectionName = "NLog", ReplaceLoggerFactory = true }).Build();
109+
110+
var loggerFact = host.Services.GetService<ILoggerFactory>();
111+
var logger = loggerFact.CreateLogger("logger1");
112+
logger.LogError("error1");
113+
114+
var loggerProvider = host.Services.GetService<ILoggerProvider>() as NLogLoggerProvider;
115+
var logged = loggerProvider.LogFactory.Configuration.FindTargetByName<Targets.MemoryTarget>("inMemory").Logs;
116+
117+
Assert.Single(logged);
118+
Assert.Equal("logger1|error1|Memory", logged[0]);
119+
}
95120
}
96121
}

0 commit comments

Comments
 (0)