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

如何在.NET Core MVC 6中用Serilog记录用户信息至日志

在.NET Core MVC 6中给Serilog添加用户ID、姓名等日志字段

要实现这个需求,需要创建自定义中间件,结合Serilog的LogContext将用户信息注入全局日志上下文,具体步骤如下:

1. 确认基础配置就绪

你的Program.cs中已经启用了Enrich.FromLogContext(),这是自定义属性注入日志的前提,无需修改此部分代码。

2. 创建用户信息日志中间件

该中间件负责从HttpContext中提取已认证用户的ID、姓名信息,并推入LogContext,让Serilog能够捕获这些字段:

public class LogUserInfoMiddleware
{
    private readonly RequestDelegate _next;

    public LogUserInfoMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        // 从用户Claims中提取信息,键名根据你的认证逻辑调整
        var userId = context.User.FindFirstValue("UserId") ?? "匿名用户";
        var userName = context.User.FindFirstValue(ClaimTypes.Name) ?? "匿名用户";

        // 将属性推入LogContext,请求结束后自动释放
        using (LogContext.PushProperty("UserId", userId))
        using (LogContext.PushProperty("Username", userName))
        {
            await _next(context);
        }
    }
}

3. 注册中间件到请求管道

在Program.cs中,将中间件注册到认证授权中间件之后,确保能获取到已认证的用户信息:

// 先启用认证与授权
app.UseAuthentication();
app.UseAuthorization();

// 注册自定义日志中间件
app.UseMiddleware<LogUserInfoMiddleware>();

4. 更新日志输出模板

修改appsettings.json的outputTemplate,添加{UserId}占位符,让日志输出包含用户ID:

"outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} {CorrelationId} {Level:u3} {UserId} {Username} {Message:lj}{NewLine}{Exception}]"

注意事项

  • 如果你的认证系统中用户ID的Claim键不是"UserId"(比如使用标准的"sub"),或者姓名的Claim键不同,需要对应修改中间件里的FindFirstValue参数。
  • 中间件顺序不可颠倒,必须在UseAuthentication()之后注册,否则无法获取用户的Claims信息。
  • using语句包裹PushProperty是为了避免请求上下文污染,确保每个请求的用户信息仅作用于当前请求的日志。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:50:25