如何通过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
相关产品推荐
相关产品推荐

