diff --git a/src/NLog/LayoutRenderers/Log4JXmlEventLayoutRenderer.cs b/src/NLog/LayoutRenderers/Log4JXmlEventLayoutRenderer.cs index 1fbd7ec29c..d98a9473dc 100644 --- a/src/NLog/LayoutRenderers/Log4JXmlEventLayoutRenderer.cs +++ b/src/NLog/LayoutRenderers/Log4JXmlEventLayoutRenderer.cs @@ -385,11 +385,13 @@ private void AppendNdc(XmlWriter xtw) private void AppendParameters(LogEventInfo logEvent, XmlWriter xtw) { - for (int i = 0; i < Parameters.Count; ++i) + for (int i = 0; i < Parameters?.Count; ++i) { var parameter = Parameters[i]; + if (string.IsNullOrEmpty(parameter?.Name)) + continue; - var parameterValue = parameter.Layout.Render(logEvent); + var parameterValue = parameter.Layout?.Render(logEvent) ?? string.Empty; if (!parameter.IncludeEmptyValue && string.IsNullOrEmpty(parameterValue)) continue; diff --git a/src/NLog/Layouts/Log4JXmlEventLayout.cs b/src/NLog/Layouts/Log4JXmlEventLayout.cs index 0f59e11fb4..b5573ae7fa 100644 --- a/src/NLog/Layouts/Log4JXmlEventLayout.cs +++ b/src/NLog/Layouts/Log4JXmlEventLayout.cs @@ -72,7 +72,7 @@ public Log4JXmlEventLayout() /// /// [ArrayParameter(typeof(NLogViewerParameterInfo), "parameter")] - public IList Parameters { get; } + public IList Parameters { get => Renderer.Parameters; set => Renderer.Parameters = value; } /// /// Gets or sets a value indicating whether to include contents of the dictionary. diff --git a/tests/NLog.UnitTests/LayoutRenderers/Log4JXmlTests.cs b/tests/NLog.UnitTests/LayoutRenderers/Log4JXmlTests.cs index 6f2752b4dc..6038966887 100644 --- a/tests/NLog.UnitTests/LayoutRenderers/Log4JXmlTests.cs +++ b/tests/NLog.UnitTests/LayoutRenderers/Log4JXmlTests.cs @@ -31,19 +31,20 @@ // THE POSSIBILITY OF SUCH DAMAGE. // -using System.Collections.Generic; -using NLog.Config; - namespace NLog.UnitTests.LayoutRenderers { - using System.Threading; - using System.Diagnostics; using System; - using System.Xml; - using System.Reflection; + using System.Collections.Generic; + using System.Diagnostics; using System.IO; - using Xunit; + using System.Reflection; + using System.Threading; + using System.Xml; + using NLog.Config; using NLog.Internal; + using NLog.Layouts; + using NLog.Targets; + using Xunit; public class Log4JXmlTests : NLogTestBase { @@ -53,8 +54,8 @@ public void Log4JXmlTest() LogManager.Configuration = XmlLoggingConfiguration.CreateFromXmlString(@" - - + + @@ -235,6 +236,35 @@ public void Log4JXmlTest() } } + [Fact] + void Log4JXmlEventLayoutParameterTest() + { + var log4jLayout = new Log4JXmlEventLayout() + { + Parameters = + { + new NLogViewerParameterInfo + { + Name = "mt", + Layout = "${message:raw=true}", + } + }, + }; + log4jLayout.Renderer.AppInfo = "MyApp"; + var logEventInfo = new LogEventInfo + { + LoggerName = "MyLOgger", + TimeStamp = new DateTime(2010, 01, 01, 12, 34, 56, DateTimeKind.Utc), + Level = LogLevel.Info, + Message = "hello, {0}", + Parameters = new[] { "world" }, + }; + + var threadid = Environment.CurrentManagedThreadId; + var machinename = Environment.MachineName; + Assert.Equal($"hello, world", log4jLayout.Render(logEventInfo)); + } + [Fact] void BadXmlValueTest() {