You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows服务应用使用NLog数据库日志时触发ArgumentException错误

解决NLog初始化时的.NET Framework数据提供程序找不到异常

我之前做Windows服务的NLog数据库日志时刚好踩过这个坑!你遇到的System.ArgumentException根本原因是NLog不认识Entity Framework那种带metadata=res://*/的实体连接字符串,它需要的是原生ADO.NET的SqlClient连接字符串,而不是EF封装后的格式。

具体解决步骤:

  1. 添加NLog专用的原生连接字符串
    保留你原来的DbEntities连接字符串给EF的DbContext使用,同时在connectionStrings节点里新增一个纯SqlClient的连接字符串:

    <connectionStrings>
      <!-- 原EF连接字符串,继续给你的DbContext用 -->
      <add name="DbEntities" connectionString="metadata=res://*/;provider=System.Data.SqlClient;provider connection string=&quot;data source=x.database.windows.net;initial catalog=YourDB;user id=YourUser;password=YourPass;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
      <!-- NLog专用的原生SqlClient连接字符串 -->
      <add name="NLogDb" connectionString="data source=x.database.windows.net;initial catalog=YourDB;user id=YourUser;password=YourPass;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
    </connectionStrings>
    
  2. 修改NLog配置指向新连接字符串
    不管你是在App.config里的<nlog>节点配置,还是用单独的NLog.config,都要把数据库目标的connectionStringName改成刚才新增的NLogDb:

    <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <targets>
        <target name="dbLog" xsi:type="Database"
                connectionStringName="NLogDb"
                commandText="INSERT INTO YourLogTable (LogLevel, Message, CreatedTime) VALUES (@level, @msg, @date)">
          <parameter name="@level" layout="${level}" />
          <parameter name="@msg" layout="${message}" />
          <parameter name="@date" layout="${date:format=yyyy-MM-dd HH:mm:ss.fff}" />
        </target>
      </targets>
      <rules>
        <logger name="*" minlevel="Trace" writeTo="dbLog" />
      </rules>
    </nlog>
    
  3. 额外排查点

    • 确认Windows服务的运行账户有数据库访问权限:服务默认可能用Local System账户,这个账户通常没有云数据库(比如你用的Azure SQL)的访问权限,需要改成有权限的专用账户,或者给服务账户添加数据库权限。
    • 如果是.NET Core/.NET 5+项目:需要确保安装了System.Data.SqlClient或者Microsoft.Data.SqlClient NuGet包,并且NLog配置里的dbProvider要对应(比如用Microsoft.Data.SqlClient的话,要加dbProvider="Microsoft.Data.SqlClient"属性)。
    • 检查服务器上的.NET Framework版本:确保和你开发时的版本一致,并且System.Data.SqlClient程序集存在(.NET Framework里是内置的,但如果是精简版可能缺失)。

内容的提问来源于stack exchange,提问作者Lord Vermillion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:59:06