Skip to content

Commit 5aa3c2d

Browse files
authored
NLogLoggingConfiguration - Add support for config variables with JsonLayout (#465)
1 parent d7384e7 commit 5aa3c2d

2 files changed

Lines changed: 49 additions & 13 deletions

File tree

src/NLog.Extensions.Logging/Config/NLogLoggingConfiguration.cs

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -160,15 +160,6 @@ public LoggingConfigurationElement(IConfigurationSection configurationSection, s
160160

161161
private IEnumerable<KeyValuePair<string, string>> GetValues()
162162
{
163-
var children = _configurationSection.GetChildren();
164-
foreach (var child in children)
165-
{
166-
if (!child.GetChildren().Any())
167-
{
168-
yield return new KeyValuePair<string, string>(GetConfigKey(child), child.Value);
169-
}
170-
}
171-
172163
if (_nameOverride != null)
173164
{
174165
if (ReferenceEquals(_nameOverride, DefaultTargetParameters))
@@ -182,7 +173,20 @@ private IEnumerable<KeyValuePair<string, string>> GetValues()
182173

183174
if (ReferenceEquals(_nameOverride, VariableKey))
184175
{
185-
yield return new KeyValuePair<string, string>("value", _configurationSection.Value);
176+
var value = _configurationSection.Value;
177+
if (value != null)
178+
yield return new KeyValuePair<string, string>("value", value);
179+
else
180+
yield break; // Signal to NLog Config Parser to check GetChildren() for variable layout
181+
}
182+
}
183+
184+
var children = _configurationSection.GetChildren();
185+
foreach (var child in children)
186+
{
187+
if (!child.GetChildren().Any())
188+
{
189+
yield return new KeyValuePair<string, string>(GetConfigKey(child), child.Value);
186190
}
187191
}
188192
}
@@ -207,10 +211,17 @@ private IEnumerable<ILoggingConfigurationElement> GetChildren()
207211
}
208212
}
209213

210-
var children = _configurationSection.GetChildren();
211-
foreach (var loggingConfigurationElement in GetChildren(children, variables, isTargetsSection))
214+
if (ReferenceEquals(_nameOverride, VariableKey) && _configurationSection.Value == null)
215+
{
216+
yield return new LoggingConfigurationElement(_configurationSection);
217+
}
218+
else
212219
{
213-
yield return loggingConfigurationElement;
220+
var children = _configurationSection.GetChildren();
221+
foreach (var loggingConfigurationElement in GetChildren(children, variables, isTargetsSection))
222+
{
223+
yield return loggingConfigurationElement;
224+
}
214225
}
215226
}
216227

test/NLog.Extensions.Logging.Tests/NLogLoggingConfigurationTests.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,31 @@ public void LoadVariablesConfig()
102102
Assert.Equal("hello.txt", (logConfig.FindTargetByName("file") as FileTarget)?.FileName.Render(LogEventInfo.CreateNullEvent()));
103103
}
104104

105+
[Fact]
106+
public void LoadVariableJsonLayoutConfig()
107+
{
108+
var memoryConfig = CreateMemoryConfigConsoleTargetAndRule();
109+
memoryConfig["NLog:Targets:file:type"] = "File";
110+
memoryConfig["NLog:Targets:file:fileName"] = "hello.txt";
111+
memoryConfig["NLog:Targets:file:layout"] = "${my_json}";
112+
memoryConfig["NLog:Targets:console:layout"] = "${my_json}";
113+
memoryConfig["NLog:Variables:my_json:type"] = "JsonLayout";
114+
memoryConfig["NLog:Variables:my_json:attributes:0:name"] = "message";
115+
memoryConfig["NLog:Variables:my_json:attributes:0:layout"] = "${message}";
116+
memoryConfig["NLog:Variables:my_json:attributes:1:name"] = "logger";
117+
memoryConfig["NLog:Variables:my_json:attributes:1:layout"] = "${logger}";
118+
119+
var logConfig = CreateNLogLoggingConfigurationWithNLogSection(memoryConfig);
120+
121+
Assert.Single(logConfig.LoggingRules);
122+
Assert.Equal(1, logConfig.Variables.Count);
123+
Assert.Equal(2, logConfig.LoggingRules[0].Targets.Count);
124+
Assert.Equal(2, logConfig.AllTargets.Count);
125+
Assert.Single(logConfig.AllTargets.Where(t => t is FileTarget));
126+
Assert.Single(logConfig.AllTargets.Where(t => t is ConsoleTarget));
127+
Assert.Equal(2, logConfig.AllTargets.Count(t => (t as TargetWithLayout)?.Layout is NLog.Layouts.JsonLayout));
128+
}
129+
105130
[Fact]
106131
public void LoadDefaultWrapperConfig()
107132
{

0 commit comments

Comments
 (0)