如何在.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
相关产品推荐
相关产品推荐

