将 NLog 与 ASP.NET Core 和 SQLite 一起使用时参数为空(或未提供给 CommandText)
Parameters empty (or not supplied to CommandText) when using NLog with ASP.NET Core and SQLite
我已经使用文档中的示例在 ASP.NET Core MVC 应用程序中设置了 NLog。记录到文件 (target=file) 没有任何问题。
但是登录Sqlite数据库出现异常:
2018-10-30 20:04:41.4394 Error DatabaseTarget(Name=db): Error when
writing to database. Exception: System.InvalidOperationException: Must
add values for the following parameters: @MachineName, @Logged,
@Level, @Message, @Logger, @Callsite, @Exception at
Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader(CommandBehavior
behavior) at Microsoft.Data.Sqlite.SqliteCommand.ExecuteNonQuery()
at NLog.Targets.DatabaseTarget.WriteEventToDatabase(LogEventInfo
logEvent) at 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>
无法使用 Microsoft.Data.Sqlite 解决问题我改为使用 System.Data.SQLite (NuGet),这立即解决了问题。
删除 Microsoft.Data.Sqlite
引用并在 .csproj 文件中添加引用 System.Data.SQLite
(撰写本文时为 1.0.109.2)。将 nlog.config 中的 dbProvider
属性值更新为 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>
我已经使用文档中的示例在 ASP.NET Core MVC 应用程序中设置了 NLog。记录到文件 (target=file) 没有任何问题。
但是登录Sqlite数据库出现异常:
2018-10-30 20:04:41.4394 Error DatabaseTarget(Name=db): Error when writing to database. Exception: System.InvalidOperationException: Must add values for the following parameters: @MachineName, @Logged, @Level, @Message, @Logger, @Callsite, @Exception at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader(CommandBehavior behavior) at Microsoft.Data.Sqlite.SqliteCommand.ExecuteNonQuery() at NLog.Targets.DatabaseTarget.WriteEventToDatabase(LogEventInfo logEvent) at 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>
无法使用 Microsoft.Data.Sqlite 解决问题我改为使用 System.Data.SQLite (NuGet),这立即解决了问题。
删除 Microsoft.Data.Sqlite
引用并在 .csproj 文件中添加引用 System.Data.SQLite
(撰写本文时为 1.0.109.2)。将 nlog.config 中的 dbProvider
属性值更新为 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>