【问题标题】:How to refer from NLog to my connection string in app.config如何在 app.config 中从 NLog 引用我的连接字符串
【发布时间】:2021-05-14 16:22:40
【问题描述】:

我有一个 .net core 3.1 控制台项目。我正在尝试将其设置为使用 NLog。我使用 2 个目标,数据库和文件。我可以写入文件但不能写入数据库。我确定连接字符串是正确的,因为我在其他项目中使用它,但它们是用 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, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, 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}"

【问题讨论】:

    标签: connection-string app-config nlog asp.net-core-3.1 asp.net-core-configuration


    【解决方案1】:

    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

    【讨论】:

    • 感谢您的尝试。它对我不起作用。我有你在我的依赖项中提到的前 3 个库。我仍然收到错误消息:写入数据库时​​出错。异常:System.InvalidOperationException:ConnectionString 属性尚未初始化。我将用我的实际连接字符串替换 nlog.config 中的连接字符串。
    • 我猜你在代码或部署中遗漏了一些东西。也许也检查一下:github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-3
    • 谢谢,但我只关心数据库日志,示例仅涉及文件日志。
    • 我建议至少检查第 4 步。
    猜你喜欢
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 2020-02-13
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    相关资源
    最近更新 更多