Serilog如何配置将自定义列日志写入SQL Server两张不同表
实现步骤
1. 安装必要NuGet包
先安装核心依赖包:
Serilog.AspNetCoreSerilog.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
相关产品推荐
相关产品推荐

