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

Serilog如何配置将自定义列日志写入SQL Server两张不同表

实现步骤

1. 安装必要NuGet包

先安装核心依赖包:

  • Serilog.AspNetCore
  • Serilog.Sinks.MSSqlServer

2. 编写双表写入配置

核心逻辑是通过嵌套Logger配置配合过滤器,将不同类型的日志分发到不同的表,同时禁用所有默认列,仅保留你需要的自定义字段。
以下是.NET 6+ 顶层语句的Program.cs配置示例:

using Serilog;
using Serilog.Sinks.MSSqlServer;
using System.Data;

// 替换为你自己的SQL Server连接字符串
var connectionString = "Server=你的数据库地址;Database=你的库名;Uid=账号;Pwd=密码;TrustServerCertificate=True;";

// 配置Information表的列规则
var infoTableColumns = new ColumnOptions
{
    // 清空默认列,仅保留自定义列
    Store = new List<StandardColumn>(),
    AdditionalColumns = new List<SqlColumn>
    {
        new SqlColumn("RequestId", SqlDbType.NVarChar, 50),
        new SqlColumn("RequestName", SqlDbType.NVarChar, 100),
        new SqlColumn("Description", SqlDbType.NVarChar, 500),
        new SqlColumn("EventDate", SqlDbType.DateTime2),
        new SqlColumn("Duration", SqlDbType.Int)
    }
};

// 配置Debug表的列规则
var debugTableColumns = new ColumnOptions
{
    Store = new List<StandardColumn>(),
    AdditionalColumns = new List<SqlColumn>
    {
        new SqlColumn("RequestId", SqlDbType.NVarChar, 50),
        new SqlColumn("Request", SqlDbType.NVarChar, -1), // -1对应nvarchar(max)
        new SqlColumn("Response", SqlDbType.NVarChar, -1)
    }
};

// 初始化Serilog
Log.Logger = new LoggerConfiguration()
    .Enrich.FromLogContext() // 开启上下文属性读取
    // 配置Information表写入:仅处理Information级别日志
    .WriteTo.Logger(lc => lc
        .Filter.IncludeOnlyLevel(Serilog.Events.LogEventLevel.Information)
        .WriteTo.MSSqlServer(
            connectionString: connectionString,
            tableName: "Information",
            columnOptions: infoTableColumns,
            autoCreateSqlTable: true // 测试环境可开启自动建表,生产环境建议关闭手动建表
        ))
    // 配置Debug表写入:仅处理Debug级别日志
    .WriteTo.Logger(lc => lc
        .Filter.IncludeOnlyLevel(Serilog.Events.LogEventLevel.Debug)
        .WriteTo.MSSqlServer(
            connectionString: connectionString,
            tableName: "Debug",
            columnOptions: debugTableColumns,
            autoCreateSqlTable: true
        ))
    .CreateLogger();

// 注册Serilog到宿主
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseSerilog();

// 其他服务注册逻辑...

var app = builder.Build();

// 中间件配置逻辑...

app.Run();

3. 日志写入示例

写入时属性名必须和配置的列名完全一致:

写入Information表日志

using Serilog.Context;

// 方式1:通过上下文批量附加属性
using (LogContext.PushProperty("RequestId", "req_123456"))
using (LogContext.PushProperty("RequestName", "获取用户列表"))
using (LogContext.PushProperty("Description", "请求处理成功"))
using (LogContext.PushProperty("EventDate", DateTime.Now))
using (LogContext.PushProperty("Duration", 156))
{
    Log.Information(""); // 不需要存储默认消息可以留空
}

// 方式2:直接在日志方法绑定属性
Log.Information("{RequestId}{RequestName}{Description}{EventDate}{Duration}", 
    "req_123456", "获取用户列表", "请求处理成功", DateTime.Now, 156);

写入Debug表日志

Log.Debug("{RequestId}{Request}{Response}", 
    "req_123456", "{\"page\":1,\"size\":10}", "{\"code\":200,\"data\":[]}");

注意事项

  • 如果不需要自动建表,把autoCreateSqlTable设为false,手动按照字段规则建表即可
  • 如果需要自定义过滤规则,替换IncludeOnlyLevel为Filter.ByIncludingOnly写自定义判断逻辑即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 20:54:01