Search code examples
c#postgresqlasp.net-web-apinlognpgsql

Nlog with Npgsql throws NLog.NLogConfigurationException: 'DatabaseParameterInfo' cannot assign unknown property 'parameterName'='@Exception'


my code is throwing me expcetion Unhandled exception. NLog.NLogConfigurationException: 'DatabaseParameterInfo' cannot assign unknown property 'parameterName'='@Exception'

I'm using NLog package (5.1.0) in my ASP.NET WEB API project. My database is PostgreSQL so I use Npgsql (Npgsql.EntityFrameworkCore.PostgreSQL and transitive package Npgsql). My configuration in appsettings.json looks like

...
"NLog": {
    "throwConfigExceptions": true,
    "autoReload": true,
    "extensions": [
      { "assembly": "NLog.Extensions.Logging" },
      { "assembly": "NLog.Web.AspNetCore" }
    ],
    "targets": {
      "async": true,
      "console": {
        "type": "Console"
      },
      "database": {
        "type": "Database",
        "dbProvider": "Npgsql.NpgsqlConnection, Npgsql",
        "connectionString": "",
        "commandText": "INSERT INTO Logs (Exception) VALUES (@Exception)",
        "parameters": [
          {
            "parameterName": "@Exception",
            "layout": "${exception:tostring}"
          }
        ]
      }
    },
    "rules": [
      {
        "logger": "*",
        "minLevel": "Trace",
        "writeTo": "console"
      },
      {
        "logger": "*",
        "minLevel": "Error",
        "writeTo": "database"
      }
    ]
  },
...

I don't set the connection string in the application settings because I want to do it programmatically in program.cs. my program.cs looks like

...
    var builder = WebApplication.CreateBuilder(args);
    var configuration = builder.configuration;

    var dbConnectionOptions = new DbConnectionOptions(configuration);
    configuration.GetSection("NLog")
        .GetSection("targets")
        .GetSection("database")
        .GetSection("connectionString").Value = dbConnectionOptions.AppDb.ConnectionString;
...

In Npgsql specification https://www.npgsql.org/doc/basic-usage.html#parameters I see, that there are two ways of defining parameters. One is using $ and another is using @ but nothing seems to work. Does anyone know what can I change to fix it?

I've tried setting commandText Values as @Exception, $Exception, Exception, %Exception, and setting parameterName as @Exception, $Exception, Exception, %Exception (mixing all options), but always got same result.


Solution

  • NLog complains about not recognizing the property parameterName.

    Try replacing:

    "parameterName": "@Exception",
    

    With:

    "name": "@Exception",
    

    See also: https://github.com/NLog/NLog.Extensions.Logging/wiki/NLog-configuration-with-appsettings.json

    Also notice that NLog v5 requires NLog.Database-nuget-package for the NLog DatabaseTarget to work.