Serilog.Sinks.MSSqlServer写入数据库时请求/响应体被截断问题
解决Serilog.Sinks.MSSqlServer写入SQL Server时Request/Response字段截断问题
问题根源
用DataColumn添加自定义列时,若没显式指定MaxLength,Serilog会默认用255的长度限制——哪怕数据库列类型是NVarchar(max),写入时还是会被截断。控制台日志正常是因为控制台输出不受这个长度限制影响。
修复方案
在定义AdditionalDataColumns里的Request和Response列时,设置MaxLength = -1(对应SQL Server的max长度)。修改后的配置代码如下:
var dbColumnOptions = new ColumnOptions { AdditionalDataColumns = new Collection<DataColumn> { new DataColumn {DataType = typeof(string), ColumnName = "Controller"}, new DataColumn {DataType = typeof(string), ColumnName = "Route"}, new DataColumn {DataType = typeof(string), ColumnName = "StatusCode"}, new DataColumn {DataType = typeof(string), ColumnName = "Method"}, // 显式设置MaxLength为-1,避免内容截断 new DataColumn {DataType = typeof(string), ColumnName = "Request", MaxLength = -1}, new DataColumn {DataType = typeof(string), ColumnName = "Response", MaxLength = -1} } }; dbColumnOptions.Store.Remove(StandardColumn.Properties); dbColumnOptions.Store.Remove(StandardColumn.MessageTemplate); dbColumnOptions.Store.Remove(StandardColumn.LogEvent); dbColumnOptions.TimeStamp.ConvertToUtc = true; LoggerConfiguration loggerConfig = new LoggerConfiguration() .Enrich.FromLogContext() .WriteTo.MSSqlServer(dbLogConnection, tableName, columnOptions: dbColumnOptions, schemaName: "any", autoCreateSqlTable: true);
补充说明
MaxLength = -1是DataColumn表示最大长度的标准写法,对应SQL Server的NVarchar(max)类型;- 如果已经手动创建了数据库表,要确认列类型确实是
NVarchar(max),避免表结构不匹配导致截断; - 该问题在Serilog.Sinks.MSSqlServer 5.x版本中存在,显式设置长度是更稳妥的处理方式。
内容的提问来源于stack exchange,提问作者Ezequiel Merecías
相关产品推荐
相关产品推荐

