'Nlog JsonLayout does not include LogEvent Properties
I try to implement this example https://github.com/nlog/nlog/wiki/JsonLayout#nested-json-with-structured-logging but output in my case has no data in eventProperties field. NLog config:
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="false"
internalLogLevel="TRACE" internalLogFile="c:\temp\nlog-internal.log">
<variable name="LogLevel" value="DEBUG"/>
<variable name="brief" value="${longdate} | ${level} | ${logger} | ${message}"/>
<variable name="verbose" value="${longdate} | ${machinename} | ${processid} | ${processname} | ${level} | ${logger} | ${message}"/>
<variable name="logLifetime" value="3"/>
<targets>
<target name="Global" xsi:type="File" fileName="Logs/GlobalLog.txt" archiveNumbering="Date" enableArchiveFileCompression="true" archiveFileName="Archive/IPSlog.{#}.zip" archiveDateFormat="yyyy-MM-dd"
maxArchiveDays="${logLifetime}"
archiveEvery="Day" >
<layout xsi:type="JsonLayout">
<attribute name="time" layout="${longdate}" />
<attribute name="level" layout="${level:upperCase=true}"/>
<attribute name="message" layout="${message}" />
<attribute name="eventProperties" encode="false" >
<layout xsi:type='JsonLayout' includeEventProperties="true" maxRecursionLimit="2"/>
</attribute>
</layout>
</target>
<target name="Color" xsi:type="Console">
<layout xsi:type="JsonLayout">
<attribute name="time" layout="${longdate}" />
<attribute name="level" layout="${level:upperCase=true}"/>
<attribute name="message" layout="${message}" />
<attribute name="eventProperties" encode="false" >
<layout xsi:type='JsonLayout' includeEventProperties="true" maxRecursionLimit="2"/>
</attribute>
</layout>
</target>
</targets>
<rules>
<logger name="Global" minlevel="${LogLevel}" writeTo="Global,Color" />
</rules>
</nlog>
c#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp5
{
[Serializable]
public class TestObject
{
public string A { get; set; }
public int B { get; set; }
public override string ToString() { return A; }
}
class Program
{
private static readonly NLog.Logger Logger = NLog.LogManager.GetLogger("Global");
static void Main(string[] args)
{
var testObj = new TestObject
{
A = "AlphaObject",
B = 2
};
var testObjB = new TestObject
{
A = "BetaObject",
B = 3
};
Logger.Info("First: {alpha}, Second: {beta}", testObj, testObjB);
Console.ReadLine();
}
}
}
My json output: { "time": "2022-02-09 14:21:27.7096", "level": "INFO", "message": "First: AlphaObject, Second: BetaObject", "eventProperties": { } }
Json output from example:
{
"time": "2018-04-02 02:00:00.2349",
"level": "Info",
"message": "First: AlphaObject, Second: BetaObject",
"eventProperties": {
"alpha": {
"A": "AlphaObject",
"B": 2
},
"beta": {
"A": "BetaObject",
"B": 3
}
}
}
I use last nuget package of nlog and this app uses .NET framework 4.5.2. Also nlog schema highlights one of layout parameters 
and nlog-internal has next warn:
Warn Error has been raised. Exception: NLog.NLogConfigurationException: Error when setting value 'true' for property 'includeEventProperties' on element 'NLog.Config.NLogXmlElement' ---> System.NotSupportedException: Parameter includeEventProperties not supported on JsonLayout
в NLog.Internal.PropertyHelper.SetPropertyFromString(Object obj, String propertyName, String value, ConfigurationItemFactory configurationItemFactory)
в NLog.Config.LoggingConfigurationParser.ConfigureObjectFromAttributes(Object targetObject, ILoggingConfigurationElement element, Boolean ignoreType)
--- Конец трассировки внутреннего стека исключений ---
Solution 1:[1]
IncludeEventProperties is for NLog 5.0, when using older version of NLog then one should use IncludeAllProperties (Older than NLog v4.7.14)
<layout xsi:type="JsonLayout">
<attribute name="time" layout="${longdate}" />
<attribute name="level" layout="${level:upperCase=true}"/>
<attribute name="message" layout="${message}" />
<attribute name="eventProperties" encode="false" >
<layout xsi:type='JsonLayout' includeAllProperties="true" maxRecursionLimit="2"/>
</attribute>
</layout>
Reason for changing the name is because NLog 5.0 also introduces the new option IncludeScopeProperties (And then IncludeAllProperties becomes confusing).
Solution 2:[2]
Try a LEFT JOIN instead of the INNER JOIN
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | Felix Geenen |
