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

ASP.NET 5 中使用NLog将日志写入SQL Server遇问题求助

在ASP.NET 5中配置NLog将日志写入SQL Server

别担心,我帮你一步步梳理清楚ASP.NET 5里用NLog写日志到SQL Server的配置流程,之前.NET Core的经验其实可以复用,只是ASP.NET 5的启动配置略有不同:

1. 安装必要的NuGet包

首先得把NLog的核心集成包和数据库支持包装上,用DotNet CLI或者NuGet包管理器都可以:

  • 安装NLog与ASP.NET Core的集成包:dotnet add package NLog.Web.AspNetCore
  • 安装NLog的数据库目标支持包:dotnet add package NLog.Database

2. 配置NLog.config文件

创建(或修改)你的NLog.config文件,记得在VS里把这个文件的复制到输出目录属性设置为「如果较新则复制」,不然运行时找不到配置。下面是完整的配置示例,你可以根据自己的需求调整字段和规则:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      internalLogLevel="Info"
      internalLogFile="internal-nlog.txt">

  <!-- 数据库目标配置 -->
  <targets>
    <target xsi:type="Database" name="sqlServerLog">
      <!-- 从appsettings.json读取连接字符串,也可以直接写死在这里 -->
      <connectionString>${configsetting:name=ConnectionStrings.LoggingDatabase}</connectionString>
      <!-- 插入日志的SQL命令,对应你数据库里的日志表结构 -->
      <commandText>
        INSERT INTO Logs (
          LogDateTime, LogLevel, Message, LoggerName, ExceptionDetails, MachineName, UserIdentity
        ) VALUES (
          @LogDate, @Level, @Message, @Logger, @Exception, @MachineName, @UserName
        );
      </commandText>
      <!-- 日志字段与SQL参数的映射 -->
      <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,StackTrace}" />
      <parameter name="@MachineName" layout="${machinename}" />
      <parameter name="@UserName" layout="${aspnet-user-identity}" />
    </target>
  </targets>

  <!-- 日志路由规则:指定哪些日志要写入数据库 -->
  <rules>
    <!-- 所有日志记录器、级别≥Info的日志都写入SQL Server -->
    <logger name="*" minlevel="Info" writeTo="sqlServerLog" />
    <!-- 如果需要排除框架日志(比如Microsoft开头的),可以加过滤规则:
    <logger name="Microsoft.*" maxlevel="Info" final="true" /> -->
  </rules>
</nlog>

3. 在appsettings.json中配置数据库连接字符串

打开appsettings.json,添加日志数据库的连接字符串:

{
  "ConnectionStrings": {
    "LoggingDatabase": "Server=你的SQL服务器地址;Database=你的日志数据库名;Trusted_Connection=True;TrustServerCertificate=True;"
  }
}

如果你用SQL Server身份验证,把连接字符串改成Server=xxx;Database=xxx;User Id=xxx;Password=xxx;TrustServerCertificate=True;

4. 在Program.cs中启用NLog

ASP.NET 5的启动逻辑在Program.cs里,需要替换默认的日志提供器为NLog:

var builder = WebApplication.CreateBuilder(args);

// 清除默认的日志提供器,避免重复日志输出
builder.Logging.ClearProviders();
// 设置最低日志级别(按需调整)
builder.Logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
// 启用NLog作为日志提供器
builder.Host.UseNLog();

// 注册其他服务(比如MVC、Controllers等)
builder.Services.AddControllersWithViews();

var app = builder.Build();

// 中间件配置...
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

5. 准备SQL Server的日志表

如果你的数据库里还没有日志表,执行下面的SQL脚本创建一个(可以根据需求增减字段):

CREATE TABLE Logs (
    LogId INT IDENTITY(1,1) PRIMARY KEY,
    LogDateTime DATETIME NOT NULL,
    LogLevel NVARCHAR(50) NOT NULL,
    Message NVARCHAR(MAX) NOT NULL,
    LoggerName NVARCHAR(255),
    ExceptionDetails NVARCHAR(MAX),
    MachineName NVARCHAR(100),
    UserIdentity NVARCHAR(255)
);

常见问题排查

  • 如果日志没写入数据库,先看输出目录里的internal-nlog.txt文件,里面会有详细的错误信息,比如连接字符串错误、表不存在、权限不足等。
  • 确保应用程序的运行身份有SQL Server数据库的读写权限(比如用IIS的话,检查应用池身份的权限)。
  • 确认NLog.config的复制属性设置正确,不然运行时加载不到配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:20:09