在.NET Core 6.0 Web API中通过Serilog LogContext添加用户名失败排查
.NET Core 6 Web API Serilog 日志不显示用户名的解决方法
问题根源及修复步骤:
属性名称大小写不匹配
你在中间件中通过LogContext.PushProperty("UserName", ...)添加的属性名称是UserName,但appsettings.json的日志输出模板里写的是{Username}——Serilog的属性名称是严格区分大小写的,这直接导致日志无法匹配到对应属性值。修复:修改appsettings.json中的
outputTemplate,将{Username}改为{UserName}:"outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss} {CorrelationId} {Level:u3}] {UserName} {Message:lj}{NewLine}{Exception}"LogContext 属性未正确管理作用域
当前中间件直接推送属性后未处理作用域,可能导致请求上下文污染(比如后续请求意外继承前一个请求的用户名),同时异步场景下也可能出现属性失效的问题。修复:修改中间件的
Invoke方法,用using包裹PushProperty,确保请求结束后自动清除该属性:public async Task Invoke(HttpContext context) { // 处理用户名null的情况,默认显示Anonymous var userName = context.User.Identity.Name ?? "Anonymous"; using (LogContext.PushProperty("UserName", userName)) { await next(context); } }中间件注册顺序验证
确保你的LogUserNameMiddleware注册在认证中间件之后,否则context.User.Identity.Name会是空值(你提到能获取到用户名,可能这一步没问题,但仍需确认)。在Program.cs中注册顺序应为:app.UseAuthentication(); app.UseAuthorization(); // 必须放在认证授权之后 app.UseMiddleware<LogUserNameMiddleware>();
验证
修改后重启应用,发起登录后的请求,日志中应该能正常显示当前登录用户名。
内容的提问来源于stack exchange,提问作者Dnyati
相关产品推荐
相关产品推荐

