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

.NET 6 Blazor Server中NLog无法写入数据库,求排查方案

排查Blazor Server(.NET 6)中NLog数据库日志写入失败问题

1. 验证Logs表结构是否匹配

SQL Server的Logs表需与NLog配置中的字段映射严格对应,以下是标准兼容的表结构(可按需扩展,但字段名、数据类型需与commandText参数一致):

CREATE TABLE [dbo].[Logs] (
    [Id] INT IDENTITY(1,1) PRIMARY KEY,
    [LogDate] DATETIME NOT NULL,
    [Level] NVARCHAR(50) NOT NULL,
    [Message] NVARCHAR(MAX) NOT NULL,
    [Logger] NVARCHAR(255),
    [Exception] NVARCHAR(MAX)
);

如果你的nlog.config中定义了额外参数(如@MachineName),需在表中添加对应字段。

2. 确认NuGet包安装完整

必须安装以下兼容.NET 6的包(建议用最新稳定版):

  • NLog.Web.AspNetCore:Blazor Server集成NLog的核心包
  • NLog.Database:数据库日志目标支持包
  • NLog:基础NLog库

通过Package Manager控制台安装:

Install-Package NLog.Web.AspNetCore
Install-Package NLog.Database

3. 检查nlog.config配置

重点确认数据库目标(target)和日志规则(rules):

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      internalLogFile="nlog-internal.log"  <!-- 启用内部日志,排查NLog自身错误 -->
      internalLogLevel="Trace">

  <targets>
    <!-- 数据库日志目标 -->
    <target name="database" xsi:type="Database">
      <!-- 连接字符串:可直接写入或引用appsettings配置 -->
      <connectionString>${configsetting:name=ConnectionStrings.DefaultConnection}</connectionString>
      <!-- SQL插入语句,参数名需与表字段对应 -->
      <commandText>
        INSERT INTO Logs (LogDate, Level, Message, Logger, Exception)
        VALUES (@LogDate, @Level, @Message, @Logger, @Exception);
      </commandText>
      <!-- 参数映射 -->
      <parameter name="@LogDate" 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}" />
      <parameter name="@Exception" layout="${exception:format=ToString}" />
    </target>
  </targets>

  <rules>
    <!-- 确保日志级别包含Trace,且关联到database目标 -->
    <logger name="*" minlevel="Trace" writeTo="database" />
  </rules>
</nlog>

注意:

  • 连接字符串需确保能正常访问SQL Server,且账号拥有Logs表的写入权限
  • 若引用appsettings中的连接字符串,需保证${configsetting:name=ConnectionStrings.xxx}路径正确

4. 验证appsettings.json配置

确保Logging配置未限制NLog的日志级别:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=.;Database=YourDbName;Trusted_Connection=True;TrustServerCertificate=True;"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Trace",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    },
    "NLog": {
      "IncludeScopes": true
    }
  }
}

5. 检查Program.cs中的NLog注册代码

.NET 6顶级语句中需正确初始化NLog:

var builder = WebApplication.CreateBuilder(args);

// 清除默认日志提供器,确保NLog接管日志
builder.Logging.ClearProviders();
// 添加NLog支持
builder.Host.UseNLog();

// 其他Blazor服务注册
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();

var app = builder.Build();

// 中间件配置
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

app.Run();

关键:必须调用builder.Host.UseNLog()或builder.Logging.AddNLog(),否则NLog不会被注入到日志系统。

6. 调试NLog内部日志

启用nlog.config中的internalLogFile后,查看生成的nlog-internal.log文件,里面会记录NLog初始化、数据库连接、日志写入的详细错误,比如:

  • 数据库连接失败
  • 表/字段不存在
  • 权限不足
  • 参数类型不匹配

7. 验证日志调用代码

确保通过依赖注入获取日志实例(符合Blazor生命周期规范):

@inject ILogger<YourComponent> Logger

@code {
    protected override void OnInitialized()
    {
        Logger.Trace("测试Trace日志");
        Logger.Debug("测试Debug日志");
        base.OnInitialized();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 11:35:25