Skip to content

Configure from JSON instead of XML #1588

@304NotModified

Description

@304NotModified

Feature,

Configure NLog from a JSON format.

todo

How to handle the multiple XML elements to a dict/list?

e.g.

    <parameter name="@msg" layout="${message}" />
    <parameter name="@level" layout="${level}" />

to

   "parameters": {
        "@msg": "${message}",
        "@level": "${level}",
      },

"XSD"

How to generate the schema def? How does this work with objects?

Large Example

Something like this:

{
  "internalLog": {
    "level": "Trace",
    "file": "d:\\work\\log.txt"
  },
  "autoReload": "true",
  "variables": {
    "gmailUsername": "${trim-whitespace:${file-contents:${basedir}/gmailusername.txt}}",
    "gmailPassword": "${trim-whitespace:${file-contents:${basedir}/gmailpassword.txt}}"
  },
  "extensions": {
    "NLog.Extended": {},
    "Custom": {
      "filePath": "..."
    }
  },
  "targets": {
    "file": {
      "type": "File",
      "fileName": "${basedir}/logs/${shortdate}.log",
      "layout": "${longdate} ${aspnet-request:servervariable=URL} ${uppercase:${level}} ${message}"
    },
    "db": {
      "type": "Database",
      "commandText": "INSERT INTO [LogEntries](TimeStamp, Message, Level, Logger) VALUES(getutcdate(), @msg, @level, @logger)",
      //todo how to rename? (was no list/dict here)
      "parameters": {
        "@msg": "${message}",
        "@level": "${level}",
        "@logger": "${logger}"
      },
      "dbProvider": "System.Data.SqlClient",
      "connectionString": "server=.\\SQLEXPRESS;database=MyLogs;integrated security=sspi",
      "install-commands": [
        {
          "text": "CREATE DATABASE MyLogs",
          "connectionString": "server=.\\SQLEXPRESS;database=master;integrated security=sspi",
          "ignoreFailures": "true"
        },
        {
          "text": "CREATE TABLE LogEntries( id int primary key not null identity(1,1), TimeStamp datetime2, Message nvarchar(max), level nvarchar(10), logger nvarchar(128))"
        }
      ],
      "uninstall-commands": [
        {
          "text": "DROP DATABASE MyLogs",
          "connectionString": "server=.\\SQLEXPRESS;database=master;integrated security=sspi",
          "ignoreFailures": "true"
        }
      ]
    },
    "eventLog": {
      "type": "EventLog",
      "source": "NLog Demo",
      "layout": "${message}${newline}Call site: ${callsite:className=true:methodName=true}${newline}Logger: ${logger}"
    },
    "pc1": {
      "type": "PerfCounter",
      "categoryName": "My Log",
      "counterName": "My Counter"
    },
    "mail": {
      "type": "Mail",
      "smtpServer": "smtp.gmail.com",
      "smtpPort": "587",
      "enableSsl": "true",
      "smtpAuthentication": "Basic",
      "smtpUserName": "${gmailUsername}",
      "smtpPassword": "${gmailPassword}",
      "from": "${gmailUsername}",
      "to": "${gmailUsername}",
      "subject": "NLogDemo logs",
      "addNewLines": "true"
    },
    "asyncMail": {
      "type": "AsyncWrapper",
      "wraps": [ "mail" ]

    },
    //no anounous wrappers
    "postFilteringWrapper": {
      "type": "PostFilteringWrapper",
      "wraps": [ "splitGroup" ],
      "defaultFilter": "level >= LogLevel.Info",
      //todo
      "when": {
        "exists": "level >= LogLevel.Error",
        "filter": "level >= LogLevel.Trace"
      }
    },
    "splitGroup": {
      "type": "SplitGroup",
      "wraps": [
        "file",
        "db",
        "eventLog",
        "pc1",
        "asyncMail"
      ]
    },
    "allOutputs": {
      "type": "AspNetBufferingWrapper",
      "wraps": [ "PostFilteringWrapper" ]
    }

  },
  "rules": [
    {
      "filter": {
        "loggerName": "*" //optional,
        "minLevel": "Trace"
      },
      "writeTo": "allOutputs"
    }
  ]
}

changes:

  • more flat, all targets must have names
  • internallog to object

95% conversion from https://github.com/NLog/NLog/wiki/NLog-config-Example

More generic feature: #951

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions