.NET 6 Web API中Nlog无法写入SQL Server问题求助
排查.NET 6 Web API中NLog无法写入SQL Server的问题
以下是针对该问题的分步排查方案,覆盖配置、代码、数据库等核心环节:
1. 开启NLog内部日志定位基础错误
直接在Nlog.config根节点添加内部日志配置,这是快速定位NLog自身运行错误的关键方式:
<nlog internalLogFile="nlog-internal.log" internalLogLevel="Warn" internalLogToConsole="true"> <!-- 你的现有配置内容 --> </nlog>
运行接口后查看生成的nlog-internal.log,文件会明确输出连接失败、SQL语法错误、权限不足等关键报错信息。
2. 核对NLog数据库目标配置
检查Nlog.config中的target节点:
- 确保
type="Database",连接字符串要么直接写正确,要么通过${configsetting:name=ConnectionStrings.LogDB}正确引用配置文件中的值 - 确认
commandText中的SQL语句与你的Logs表结构完全匹配:字段名拼写、参数占位符(如@logTime、@level)要和表字段一一对应,比如表中是LogLevel字段,SQL里的参数不能写成@level却未正确映射 - 参考正确的参数映射配置示例:
<target xsi:type="Database" name="database" connectionString="${configsetting:name=ConnectionStrings.LogDB}"> <commandText> INSERT INTO Logs (LogTime, Level, Message, Logger) VALUES (@logTime, @level, @message, @logger) </commandText> <parameter name="@logTime" layout="${date:format=yyyy-MM-dd HH:mm:ss.fff}" /> <parameter name="@level" layout="${level}" /> <parameter name="@message" layout="${message}" /> <parameter name="@logger" layout="${logger}" /> </target>
3. 检查Program.cs的NLog集成逻辑
确认代码中正确初始化NLog,无关键步骤遗漏:
var builder = WebApplication.CreateBuilder(args); // 清除默认日志提供器,避免与NLog冲突 builder.Logging.ClearProviders(); // 引入NLog服务 builder.Host.UseNLog(); // 其他服务注册代码...
如果同时引入了Serilog等其他日志框架,会导致NLog无法正常工作,可暂时移除其他日志组件测试。
4. 验证appsettings配置
- 如果连接字符串来自
appsettings.json,确认节点名称与NLog引用的名称完全一致:
"ConnectionStrings": { "LogDB": "Server=你的服务器名;Database=你的数据库名;Trusted_Connection=True;TrustServerCertificate=True;" }
- 检查日志级别配置,确保未限制NLog的输出:比如不要把
Logging.LogLevel.Default设为Error,却在控制器里调用LogInformation,低级别的日志会被过滤。
5. 控制器日志调用与规则检查
- 确认控制器正确注入
ILogger,且调用的日志级别符合NLog规则要求:
private readonly ILogger<YourController> _logger; public YourController(ILogger<YourController> logger) { _logger = logger; } [HttpGet] public IActionResult Get() { // 确保调用的日志级别在NLog规则的minlevel范围内 _logger.LogInformation("测试写入数据库日志"); return Ok(); }
- 检查NLog的规则配置,确保允许对应日志写入数据库目标:
<rules> <logger name="*" minlevel="Info" writeTo="database" /> </rules>
6. 数据库端排查
- 确认SQL Server服务正常运行,连接字符串中的服务器、数据库名无误
- 确认运行API的身份(IIS应用池账号/控制台运行账号)拥有
Logs表的INSERT权限,可手动给账号赋权测试 - 复制NLog配置中的SQL语句,在SSMS中执行,验证是否能正常插入数据,排查表结构不匹配、语法错误等问题
内容的提问来源于stack exchange,提问作者Pablo52
相关产品推荐
相关产品推荐

