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

如何通过appsetting.json配置为Serilog Sink.MySQL添加自定义列

解决方案

1. 修正配置节点名称

绝大多数情况下配置不生效是因为节点名错误,Serilog.Sinks.MySQL 配置自定义列的默认节点名为 columnOptions,而非 columnOptionsSection,除非你在代码注册时手动指定了自定义section名称。
修正后的完整配置参考:

"Serilog": {
  "Using": [ "Serilog.Sinks.MySQL" ],
  "MinimumLevel": "Information",
  "WriteTo": [
    {
      "Name": "MySQL",
      "Args": {
        "connectionString": "你的数据库连接串",
        "tableName": "你的日志表名",
        "autoCreateTable": true,
        "columnOptions": {
          "customColumns": [
            {
              "ColumnName": "UserId",
              "DataType": "nvarchar",
              "DataLength": 450,
              "AllowNull": true
            },
            {
              "ColumnName": "UserName",
              "DataType": "nvarchar",
              "DataLength": 256,
              "AllowNull": true
            }
          ]
        }
      }
    }
  ],
  "Enrich": [ "FromLogContext" ]
}

2. 确保初始化代码正确读取配置

初始化Serilog时必须加载配置文件且启用配置读取,Program.cs参考代码:

var builder = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json")
    .Build();

Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(builder)
    .CreateLogger();

3. 主动写入自定义字段值到日志上下文

仅配置列结构不会自动填充值,需要在打印日志前将对应字段推入日志上下文:

// 登陆成功后或者请求处理前写入上下文
using (LogContext.PushProperty("UserId", 当前用户ID))
using (LogContext.PushProperty("UserName", 当前用户名))
{
    Log.Information("用户执行了某某操作");
}

4. 处理表结构适配问题

  • 如果日志表已经提前创建,不会自动新增自定义列,需要手动执行SQL添加对应字段:
ALTER TABLE 你的日志表名 
ADD COLUMN UserId nvarchar(450) NULL,
ADD COLUMN UserName nvarchar(256) NULL;
  • 若允许自动重建表,可以将配置里的autoCreateTable设为true,注意会清空原有日志数据。

5. 版本兼容校验

如果以上配置都正确仍不生效,将Serilog.Sinks.MySQL升级到最新稳定版即可,部分老旧版本不支持通过配置文件声明自定义列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:24:01