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

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);

补充说明

  1. MaxLength = -1是DataColumn表示最大长度的标准写法,对应SQL Server的NVarchar(max)类型;
  2. 如果已经手动创建了数据库表,要确认列类型确实是NVarchar(max),避免表结构不匹配导致截断;
  3. 该问题在Serilog.Sinks.MSSqlServer 5.x版本中存在,显式设置长度是更稳妥的处理方式。

内容的提问来源于stack exchange,提问作者Ezequiel Merecías

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 06:02:43