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

在.NET Core 6.0 Web API中通过Serilog LogContext添加用户名失败排查

.NET Core 6 Web API Serilog 日志不显示用户名的解决方法

问题根源及修复步骤:

  1. 属性名称大小写不匹配
    你在中间件中通过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}"
    
  2. 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);
        }
    }
    
  3. 中间件注册顺序验证
    确保你的LogUserNameMiddleware注册在认证中间件之后,否则context.User.Identity.Name会是空值(你提到能获取到用户名,可能这一步没问题,但仍需确认)。在Program.cs中注册顺序应为:

    app.UseAuthentication();
    app.UseAuthorization();
    
    // 必须放在认证授权之后
    app.UseMiddleware<LogUserNameMiddleware>();
    

验证

修改后重启应用,发起登录后的请求,日志中应该能正常显示当前登录用户名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:57:18