From 5aa3c2d94317e78c5f4bdf361f5ef868adac1f3e Mon Sep 17 00:00:00 2001 From: Rolf Kristensen Date: Thu, 26 Aug 2021 23:56:28 +0200 Subject: [PATCH] NLogLoggingConfiguration - Add support for config variables with JsonLayout (#465) --- .../Config/NLogLoggingConfiguration.cs | 37 ++++++++++++------- .../NLogLoggingConfigurationTests.cs | 25 +++++++++++++ 2 files changed, 49 insertions(+), 13 deletions(-) diff --git a/src/NLog.Extensions.Logging/Config/NLogLoggingConfiguration.cs b/src/NLog.Extensions.Logging/Config/NLogLoggingConfiguration.cs index 7aa55911..38ab2a88 100644 --- a/src/NLog.Extensions.Logging/Config/NLogLoggingConfiguration.cs +++ b/src/NLog.Extensions.Logging/Config/NLogLoggingConfiguration.cs @@ -160,15 +160,6 @@ public LoggingConfigurationElement(IConfigurationSection configurationSection, s private IEnumerable> GetValues() { - var children = _configurationSection.GetChildren(); - foreach (var child in children) - { - if (!child.GetChildren().Any()) - { - yield return new KeyValuePair(GetConfigKey(child), child.Value); - } - } - if (_nameOverride != null) { if (ReferenceEquals(_nameOverride, DefaultTargetParameters)) @@ -182,7 +173,20 @@ private IEnumerable> GetValues() if (ReferenceEquals(_nameOverride, VariableKey)) { - yield return new KeyValuePair("value", _configurationSection.Value); + var value = _configurationSection.Value; + if (value != null) + yield return new KeyValuePair("value", value); + else + yield break; // Signal to NLog Config Parser to check GetChildren() for variable layout + } + } + + var children = _configurationSection.GetChildren(); + foreach (var child in children) + { + if (!child.GetChildren().Any()) + { + yield return new KeyValuePair(GetConfigKey(child), child.Value); } } } @@ -207,10 +211,17 @@ private IEnumerable GetChildren() } } - var children = _configurationSection.GetChildren(); - foreach (var loggingConfigurationElement in GetChildren(children, variables, isTargetsSection)) + if (ReferenceEquals(_nameOverride, VariableKey) && _configurationSection.Value == null) + { + yield return new LoggingConfigurationElement(_configurationSection); + } + else { - yield return loggingConfigurationElement; + var children = _configurationSection.GetChildren(); + foreach (var loggingConfigurationElement in GetChildren(children, variables, isTargetsSection)) + { + yield return loggingConfigurationElement; + } } } diff --git a/test/NLog.Extensions.Logging.Tests/NLogLoggingConfigurationTests.cs b/test/NLog.Extensions.Logging.Tests/NLogLoggingConfigurationTests.cs index d4db8c26..cb276fad 100644 --- a/test/NLog.Extensions.Logging.Tests/NLogLoggingConfigurationTests.cs +++ b/test/NLog.Extensions.Logging.Tests/NLogLoggingConfigurationTests.cs @@ -102,6 +102,31 @@ public void LoadVariablesConfig() Assert.Equal("hello.txt", (logConfig.FindTargetByName("file") as FileTarget)?.FileName.Render(LogEventInfo.CreateNullEvent())); } + [Fact] + public void LoadVariableJsonLayoutConfig() + { + var memoryConfig = CreateMemoryConfigConsoleTargetAndRule(); + memoryConfig["NLog:Targets:file:type"] = "File"; + memoryConfig["NLog:Targets:file:fileName"] = "hello.txt"; + memoryConfig["NLog:Targets:file:layout"] = "${my_json}"; + memoryConfig["NLog:Targets:console:layout"] = "${my_json}"; + memoryConfig["NLog:Variables:my_json:type"] = "JsonLayout"; + memoryConfig["NLog:Variables:my_json:attributes:0:name"] = "message"; + memoryConfig["NLog:Variables:my_json:attributes:0:layout"] = "${message}"; + memoryConfig["NLog:Variables:my_json:attributes:1:name"] = "logger"; + memoryConfig["NLog:Variables:my_json:attributes:1:layout"] = "${logger}"; + + var logConfig = CreateNLogLoggingConfigurationWithNLogSection(memoryConfig); + + Assert.Single(logConfig.LoggingRules); + Assert.Equal(1, logConfig.Variables.Count); + Assert.Equal(2, logConfig.LoggingRules[0].Targets.Count); + Assert.Equal(2, logConfig.AllTargets.Count); + Assert.Single(logConfig.AllTargets.Where(t => t is FileTarget)); + Assert.Single(logConfig.AllTargets.Where(t => t is ConsoleTarget)); + Assert.Equal(2, logConfig.AllTargets.Count(t => (t as TargetWithLayout)?.Layout is NLog.Layouts.JsonLayout)); + } + [Fact] public void LoadDefaultWrapperConfig() {