问题描述
我有一个 .net core 3.1 控制台项目。我正在尝试将其设置为使用 NLog。我使用 2 个目标,db 和 file。我可以写入文件但不能写入数据库。我确定连接字符串是正确的,因为我在其他项目中使用它,但它们是用 4.7 框架编写的。
这是我的 app.config 设置:
<connectionStrings>
<add name="NLog" connectionString="Data Source=mySource;Initial Catalog=MyLogging;Integrated Security=sspI;" />
</connectionStrings>
这是我在目标中设置它的尝试:
<?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"
autoReload="true"
internalLogLevel="Info"
internalLogFile="c:\temp\nlog-internal.log">
<!-- enable asp.net core layout renderers -->
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
<!-- the targets to write to -->
<targets>
<target name="database" xsi:type="Database" connectionString="${configsetting:name=NLog}" commandType="StoredProcedure" commandText="[dbo].[MyLogEntry]">
</target>
</targets>
<rules>
<logger name="*" minlevel="Trace" writeto="Database" />
</rules>
</nlog>
来自 c:\temp\nlog-internal.log 的错误消息是:
2021-02-10 16:11:48.3381 Error DatabaseTarget(Name=database): Error when writing to database. Exception: system.invalidOperationException: The ConnectionString property has not been initialized.
at System.Data.sqlClient.sqlConnection.Permissiondemand()
at System.Data.sqlClient.sqlConnectionFactory.Permissiondemand(DbConnection outerConnection)
at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection,DbConnectionFactory connectionFactory,taskcompletionsource`1 retry,DbConnectionoptions userOptions)
at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection,DbConnectionoptions userOptions)
at System.Data.sqlClient.sqlConnection.TryOpen(taskcompletionsource`1 retry)
at System.Data.sqlClient.sqlConnection.open()
at NLog.Targets.DatabaseTarget.OpenConnection(String connectionString,LogEventInfo logEventInfo)
at NLog.Targets.DatabaseTarget.EnsureConnectionopen(String connectionString,LogEventInfo logEventInfo)
at NLog.Targets.DatabaseTarget.WriteLogEventToDatabase(LogEventInfo logEvent,String connectionString)
问题出在:connectionString="${configsetting:name=NLog}"
解决方法
app.config 并不真正适合 ASP.NET Core。这是可能的,但它很脏。
建议转到 JSON 应用程序设置,例如 appsettings.json(请参阅 Configuration in ASP.NET Core)
例如:
appsettings.json:
{
"ConnectionStrings":{
"NLog":"Data Source=mySource;Initial Catalog=MyLogging;Integrated Security=SSPI;",}
}
和用法:${configsetting:item=ConnectionStrings.NLog}
请注意,对于 ${configsetting}
,您需要以下软件包之一:
- NLog.Extensions.Logging,
- NLog.Extensions.Hosting 和/或
- NLog.Web.AspNetCore
见https://nlog-project.org/config/?tab=layout-renderers&search=configsetting