I added NLog Google Stackdriver target to NLog section of my appsettings.json:
{
"stackdriver": {
"type": "GoogleStackdriver",
"projectId": "*********",
"logId": "*******",
"sendJsonPayload": true,
"layout": {
"type": "JsonLayout",
"Attributes": [
{
"name": "level",
"layout": "${level:uppercase=true}"
},
{
"name": "traceidentifier",
"layout": "${aspnet-traceidentifier}"
},
{
"name": "ip",
"layout": "${aspnet-request-ip}"
},
{
"name": "level",
"layout": "${level:uppercase=true}"
},
{
"name": "logger",
"layout": "${logger}"
},
{
"name": "url",
"layout": "${aspnet-request-url:IncludePort=true:IncludeQueryString=true}"
},
{
"name": "message",
"layout": "${message}"
},
{
"name": "exception",
"layout": "${exception:format=toString}"
},
{
"name": "useragent",
"layout": "${aspnet-request-useragent}"
}
]
}
}
}
But JSON is converted to a string value of jsonPayload message property:

Is this by design or something wrong?
Is this by design or something wrong?
This is by design. NLog JsonLayout doesn't produce a Json-object, but a Json-string. The Google StackDriver expects to receive a Json-Object.
To avoid first creating a Json-String, and then parsing the Json-String into a Json-Object, then one is expected to use <contextproperty> (or json contextProperties) on the GoogleStackdriver-target.
Ex:
{
"stackdriver": {
"type": "GoogleStackdriver",
"projectId": "*********",
"logId": "*******",
"sendJsonPayload": true,
"contextProperties": [
{
"name": "level",
"layout": "${level:uppercase=true}"
},
{
"name": "traceidentifier",
"layout": "${aspnet-traceidentifier}"
},
{
"name": "ip",
"layout": "${aspnet-request-ip}"
},
{
"name": "level",
"layout": "${level:uppercase=true}"
},
{
"name": "logger",
"layout": "${logger}"
},
{
"name": "url",
"layout": "${aspnet-request-url:IncludePort=true:IncludeQueryString=true}"
},
{
"name": "message",
"layout": "${message}"
},
{
"name": "exception",
"layout": "${exception:format=toString}"
},
{
"name": "useragent",
"layout": "${aspnet-request-useragent}"
}
]
}
}
Thanks, now I get it