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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:30:33