Windows服务应用使用NLog数据库日志时触发ArgumentException错误
解决NLog初始化时的.NET Framework数据提供程序找不到异常
我之前做Windows服务的NLog数据库日志时刚好踩过这个坑!你遇到的System.ArgumentException根本原因是NLog不认识Entity Framework那种带metadata=res://*/的实体连接字符串,它需要的是原生ADO.NET的SqlClient连接字符串,而不是EF封装后的格式。
具体解决步骤:
添加NLog专用的原生连接字符串
保留你原来的DbEntities连接字符串给EF的DbContext使用,同时在connectionStrings节点里新增一个纯SqlClient的连接字符串:<connectionStrings> <!-- 原EF连接字符串,继续给你的DbContext用 --> <add name="DbEntities" connectionString="metadata=res://*/;provider=System.Data.SqlClient;provider connection string="data source=x.database.windows.net;initial catalog=YourDB;user id=YourUser;password=YourPass;MultipleActiveResultSets=True;App=EntityFramework"" 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>修改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>额外排查点
- 确认Windows服务的运行账户有数据库访问权限:服务默认可能用Local System账户,这个账户通常没有云数据库(比如你用的Azure SQL)的访问权限,需要改成有权限的专用账户,或者给服务账户添加数据库权限。
- 如果是.NET Core/.NET 5+项目:需要确保安装了
System.Data.SqlClient或者Microsoft.Data.SqlClientNuGet包,并且NLog配置里的dbProvider要对应(比如用Microsoft.Data.SqlClient的话,要加dbProvider="Microsoft.Data.SqlClient"属性)。 - 检查服务器上的.NET Framework版本:确保和你开发时的版本一致,并且System.Data.SqlClient程序集存在(.NET Framework里是内置的,但如果是精简版可能缺失)。
内容的提问来源于stack exchange,提问作者Lord Vermillion
相关产品推荐
相关产品推荐

