Параметры пустые (или не передаются в CommandText) при использовании NLog с ASP.NET Core и SQLite - PullRequest
0 голосов
/ 30 октября 2018

Я настроил NLog в приложении ASP.NET Core MVC, используя примеры в документации. Регистрация в файл (target = file) работает без проблем.

Однако при входе в базу данных Sqlite возникает исключение:

2018-10-30 20: 04: 41.4394 Ошибка DatabaseTarget (Name = db): ошибка, когда запись в базу данных. Исключение: System.InvalidOperationException: должно добавить значения для следующих параметров: @MachineName, @Logged, @Level, @Message, @Logger, @Callsite, @Exception at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader (CommandBehavior поведение) в Microsoft.Data.Sqlite.SqliteCommand.ExecuteNonQuery () в NLog.Targets.DatabaseTarget.WriteEventToDatabase (LogEventInfo logEvent) в NLog.Targets.DatabaseTarget.Write (LogEventInfo LogEvent)

Есть идеи, почему значения этих параметров пусты? А может, параметры вообще не передаются?

Файл конфигурации NLog:

<?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">

  <targets>
    <target xsi:type="File" name="file" fileName="nlog-${shortdate}.log"
            layout="${longdate}|${machinename}|${level:upperCase=true}|${logger}|${callsite}|${message} ${exception:tostring}" />

    <target xsi:type="Database"
            name="db"
            dbProvider="Microsoft.Data.Sqlite.SqliteConnection, Microsoft.Data.Sqlite"
            connectionString="Data Source=database.db;">

      <commandText>
        INSERT INTO Log (MachineName, Logged, Level, Message, Logger, CallSite, Exception)
        VALUES (@MachineName, @Logged, @Level, @Message, @Logger, @Callsite, @Exception);
      </commandText>

      <parameter name="@MachineName" layout="${machinename}" />
      <parameter name="@Logged" layout="${longdate}" />
      <parameter name="@Level" layout="${level:upperCase=true}" />
      <parameter name="@Message" layout="${message}" />
      <parameter name="@Logger" layout="${logger}" />
      <parameter name="@CallSite" layout="${callsite}" />
      <parameter name="@Exception" layout="${exception:tostring}" />
    </target>
  </targets>

  <rules>
    <logger name="*" minlevel="Trace" writeTo="file" />
    <logger name="*" minlevel="Info" writeTo="db" />
  </rules>
</nlog>

1 Ответ

0 голосов
/ 09 ноября 2018

Невозможно решить проблему с помощью Microsoft.Data.Sqlite. Я переключился на использование System.Data.SQLite ( NuGet ), что сразу решило проблему.

Удалите ссылку Microsoft.Data.Sqlite и добавьте ссылку System.Data.SQLite (1.0.109.2 на момент написания) в ваш файл .csproj . Обновите значение атрибута dbProvider в nlog.config до System.Data.SQLite.SQLiteConnection, System.Data.SQLite и все готово.

Фрагмент nlog.config:

<target xsi:type="Database"
            name="db"
            dbProvider="System.Data.SQLite.SQLiteConnection, System.Data.SQLite"
            connectionString="Data Source=database.db;">
   ...
</target>
...