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..55e63b72e0 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),
+ 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()
{