Serilog SQL Server Sink自定义表:如何映射日志消息至Info列
问题解答
能否仅通过配置文件实现?
可以。Serilog SQL Server Sink支持通过配置文件自定义列映射,将内置的渲染后日志消息(Message)直接关联到你的Info列,无需修改业务代码。
具体配置步骤如下:
- 在
appsettings.json的Serilog配置中,针对SqlServer sink配置columnOptions:- 禁用默认的
Message列(避免冗余存储); - 添加自定义
Info列,指定其关联的属性为内置的Message,并匹配表列的数据类型。
- 禁用默认的
示例配置代码:
"Serilog": { "WriteTo": [ { "Name": "SqlServer", "Args": { "connectionString": "你的数据库连接字符串", "tableName": "你的自定义日志表名", "columnOptionsSection": { "removeStandardColumns": ["Message"], // 移除默认生成的Message列 "columns": { "Id": { "DataType": "Int32", "AllowNull": false, "PrimaryKey": true, "AutoIncrement": true }, "Info": { "DataType": "NVarChar", "DataLength": -1, // 对应SQL的NVARCHAR(MAX) "PropertyName": "Message" // 将日志事件的Message字段映射到Info列 } } } } } ] }
注意:确保你的自定义日志表结构和配置中的列定义完全匹配(比如Info列类型需为NVARCHAR(MAX)或对应长度)。
若配置方式受限,如何全局映射Message至Info列?
如果因版本兼容或其他原因无法通过配置实现,可通过全局添加日志事件增强器(Enricher)的方式,自动将日志消息复制到Info属性,再映射到表的Info列,完全无需修改业务代码中的日志调用。
实现步骤:
- 自定义日志事件增强器:
public class MessageToInfoEnricher : ILogEventEnricher { public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory) { // 将渲染后的日志消息添加为Info属性 var infoProperty = propertyFactory.CreateProperty("Info", logEvent.MessageTemplate.Render(logEvent.Properties)); logEvent.AddPropertyIfAbsent(infoProperty); } }
- 在Serilog初始化时注册该增强器:
var logger = new LoggerConfiguration() .ReadFrom.Configuration(Configuration) .Enrich.With<MessageToInfoEnricher>() // 全局生效,所有日志事件都会添加Info属性 .CreateLogger();
- 在
appsettings.json的SqlServer sink配置中,将Info列映射到Info属性:
"columnOptionsSection": { "columns": { "Id": { "DataType": "Int32", "AllowNull": false, "PrimaryKey": true, "AutoIncrement": true }, "Info": { "DataType": "NVarChar", "DataLength": -1, "PropertyName": "Info" } } }
这种方式会自动为所有日志事件注入Info属性,值为渲染后的日志消息,最终写入到表的Info列,完全不需要修改业务代码中的500处日志调用。
内容的提问来源于stack exchange,提问作者smith
相关产品推荐
相关产品推荐

