ASP.NET Core 3.1 下 Serilog 写入SQL自定义UserName列不生效问题求助
Serilog自定义SQL列UserName为空问题解决方案
问题根源
- 核心原因是属性名大小写不匹配:
- 你在自定义中间件中通过
LogContext.PushProperty("Username", userName)推入上下文的属性名为Username(s小写) - 你在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
相关产品推荐
相关产品推荐

