Google-cloud-dotnet: NLog JsonLayout into Stackdriver jsonPayload conversion

Created on 25 Oct 2019  路  2Comments  路  Source: googleapis/google-cloud-dotnet

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:
image
Is this by design or something wrong?

logging question

All 2 comments

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

Was this page helpful?
0 / 5 - 0 ratings