Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NLogProviderOptions - Added LoggingConfigurationSectionName #501

Merged
merged 4 commits into from
May 1, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions src/NLog.Extensions.Hosting/Extensions/ConfigureExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@
using System.Reflection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using NLog.Config;
using NLog.Extensions.Logging;

Expand Down Expand Up @@ -52,9 +50,14 @@ private static NLogLoggerProvider CreateNLogLoggerProvider(IServiceProvider serv
{
configuration = SetupConfiguration(serviceProvider, configuration);
NLogLoggerProvider provider = new NLogLoggerProvider(options);
if (configuration != null && options == null)
if (configuration != null)
{
provider.Configure(configuration.GetSection("Logging:NLog"));
if (options == null)
{
provider.Configure(configuration.GetSection("Logging:NLog"));
}

provider.TryLoadConfigurationFromSection(configuration);
}
return provider;
}
Expand Down
10 changes: 8 additions & 2 deletions src/NLog.Extensions.Logging/Extensions/ConfigureExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -250,10 +250,16 @@ private static NLogLoggerProvider CreateNLogLoggerProvider(IServiceProvider serv
{
NLogLoggerProvider provider = new NLogLoggerProvider(options ?? NLogProviderOptions.Default, logFactory ?? LogManager.LogFactory);
configuration = SetupConfiguration(serviceProvider, configuration);
if (configuration != null && options == null)
if (configuration != null)
{
provider.Configure(configuration.GetSection("Logging:NLog"));
if (options == null)
{
provider.Configure(configuration.GetSection("Logging:NLog"));
}

provider.TryLoadConfigurationFromSection(configuration);
}

return provider;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
namespace NLog.Extensions.Logging
{
#if !NETCORE1_0
using System;
using System.Linq;
using Microsoft.Extensions.Configuration;
#if !NETCORE1_0
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Logging;
#endif

internal static class RegisterNLogLoggingProvider
{
#if !NETCORE1_0
internal static void TryAddNLogLoggingProvider(this IServiceCollection services, Action<IServiceCollection, Action<ILoggingBuilder>> addLogging, IConfiguration configuration, NLogProviderOptions options, Func<IServiceProvider, IConfiguration, NLogProviderOptions, NLogLoggerProvider> factory)
{
var sharedFactory = factory;
Expand All @@ -30,6 +33,24 @@ internal static void TryAddNLogLoggingProvider(this IServiceCollection services,
addLogging?.Invoke(services, (builder) => builder?.AddFilter<NLogLoggerProvider>(null, Microsoft.Extensions.Logging.LogLevel.Trace));
}
}
}
#endif

internal static void TryLoadConfigurationFromSection(this NLogLoggerProvider loggerProvider, IConfiguration configuration)
{
if (string.IsNullOrEmpty(loggerProvider.Options.LoggingConfigurationSectionName))
return;

var nlogConfig = configuration.GetSection(loggerProvider.Options.LoggingConfigurationSectionName);
if (nlogConfig?.GetChildren()?.Any() == true)
{
loggerProvider.LogFactory.Setup().LoadConfiguration(configBuilder =>
{
if (configBuilder.Configuration.LoggingRules.Count == 0 && configBuilder.Configuration.AllTargets.Count == 0)
{
configBuilder.Configuration = new NLogLoggingConfiguration(nlogConfig);
}
});
}
}
}
}
6 changes: 6 additions & 0 deletions src/NLog.Extensions.Logging/Logging/NLogProviderOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,12 @@ public class NLogProviderOptions
/// <remarks>This option affects the building of service configuration, so assigning it from appsettings.json has no effect (loaded after).</remarks>
public bool ReplaceLoggerFactory { get; set; }

/// <summary>
/// Checks the Host Configuration for the specified section-name, and tries to load NLog-LoggingConfiguration after creation of NLogLoggerProvider
/// </summary>
/// <remarks>Will only attempt to load NLog-LoggingConfiguration if valid section-name, and NLog-LoggingConfiguration has not been loaded already.</remarks>
public string LoggingConfigurationSectionName { get; set; }

/// <summary>Initializes a new instance NLogProviderOptions with default values.</summary>
public NLogProviderOptions()
{
Expand Down
25 changes: 25 additions & 0 deletions test/NLog.Extensions.Hosting.Tests/ExtensionMethodTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -92,5 +92,30 @@ public void UseNLog_ReplaceLoggerFactory()

Assert.Equal(typeof(NLogLoggerFactory), loggerFactory.GetType());
}

[Fact]
public void UseNLog_LoadConfigurationFromSection()
{
var host = new HostBuilder().ConfigureAppConfiguration((context, config) =>
{
var memoryConfig = new Dictionary<string, string>();
memoryConfig["NLog:Rules:0:logger"] = "*";
memoryConfig["NLog:Rules:0:minLevel"] = "Trace";
memoryConfig["NLog:Rules:0:writeTo"] = "inMemory";
memoryConfig["NLog:Targets:inMemory:type"] = "Memory";
memoryConfig["NLog:Targets:inMemory:layout"] = "${logger}|${message}|${configsetting:NLog.Targets.inMemory.type}";
config.AddInMemoryCollection(memoryConfig);
}).UseNLog(new NLogProviderOptions() { LoggingConfigurationSectionName = "NLog", ReplaceLoggerFactory = true }).Build();

var loggerFact = host.Services.GetService<ILoggerFactory>();
var logger = loggerFact.CreateLogger("logger1");
logger.LogError("error1");

var loggerProvider = host.Services.GetService<ILoggerProvider>() as NLogLoggerProvider;
var logged = loggerProvider.LogFactory.Configuration.FindTargetByName<Targets.MemoryTarget>("inMemory").Logs;

Assert.Single(logged);
Assert.Equal("logger1|error1|Memory", logged[0]);
}
}
}