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

ASP.NET Core 3.1 下 Serilog 写入SQL自定义UserName列不生效问题求助

Serilog自定义SQL列UserName为空问题解决方案

问题根源

  • 核心原因是属性名大小写不匹配:
    1. 你在自定义中间件中通过LogContext.PushProperty("Username", userName)推入上下文的属性名为Username(s小写)
    2. 你在MSSQL Sink配置中定义的自定义列名为UserName(N大写)
      Serilog的属性到列的匹配逻辑是区分大小写的,因此无法将上下文中的属性值映射到对应的SQL列,导致列值为空。
  • 你的配置逻辑本身是正确的,不需要每次写日志时显式传入UserName参数,通过LogContext全局自动注入的方案是可行的。

修复方案

二选一即可:

方案1:统一属性名

修改中间件中推入的属性名,和SQL列名保持完全一致:

app.Use(async (context, next) =>
{
    var userName = context.User.Identity.IsAuthenticated ? context.User.Identity.Name : "Guest";
    // 修改属性名为UserName,和自定义列名完全匹配
    LogContext.PushProperty("UserName", userName);
    await next(); 
});

方案2:显式指定属性映射

如果你不想修改中间件的属性名,可以在配置SQL列时显式指定对应的Serilog属性名,适配大小写差异:

AdditionalColumns = new Collection<SqlColumn>
{
    new SqlColumn 
    { 
        ColumnName = "UserName", 
        PropertyName = "Username", // 显式指定对应Serilog上下文的属性名
        DataType = SqlDbType.NVarChar 
    }
}

验证

修改完成后重启应用,重新触发日志写入,即可看到UserName列已经自动填充对应值,无需修改现有日志写入代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 08:27:03