如何从 NLog 引用我在 app.config 中的连接字符串

问题描述

我有一个 .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