我正在尝试使用 .Net Core MVC 6 中的 Serilog 在日志中显示请求和响应。但我还需要显示用户的信息。我怎样才能证明我以前从未使用过日志记录?
程序.cs
var logger = new LoggerConfiguration()
.ReadFrom.Configuration(builder.Configuration)
.Enrich.FromLogContext()
.CreateLogger();
builder.Host.UseSerilog(logger);
应用程序设置.json
"Serilog": {
"Using": [ "Serilog.Sinks.File" ],
"MinimumLevel": {
"Default": "Information"
},
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "../Logs/webapi-.log",
"rollingInterval": "Hour",
"outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} {CorrelationId} {Level:u3} {Username} {Message:lj}{NewLine}{Exception}]"
}
}
]
}
我可以创建一个日志文件,但如何在其中添加用户的 ID、名称等?我应该创建一个中间件吗?
您可以编写自定义中间件来实现这一点。 首先在 ctor 中保留“下一个”中间件步骤:
public UserIdLoggingMiddleware(RequestDelegate next)
{
_next = next;
}
现在将下一个逻辑放入中间件调用方法中:
public Task Invoke(HttpContext context)
{
string userId = GetUserId(context);
using (LogContext.PushProperty("UserId", userId))
{
return _next.Invoke(context);
}
}
您可以从上下文中获取用户ID(如果用户被授权):
private static string GetUserId(HttpContext context)
{
context.Request.Headers.TryGetValue(
"UserIdHeaderName", out StringValues userIds);
return userIds.FirstOrDefault() ?? "unknown-user";
}
像这样注册你的中间件:
app.UseMiddleware<UserIdLoggingMiddleware>();
最后,您的日志请求可能如下所示:
{
"UserId": "0HMVSP0L8FVEN",
"CorrelationId": "0HMVSP0L8FVEN:0000000B",
"Elapsed": 24.792778,
"RequestId": "0HMVSP0L8FVEN:0000000B",
"RequestMethod": "POST",
"RequestPath": "/api/users",
"SourceContext": "Serilog.AspNetCore.RequestLoggingMiddleware",
"StatusCode": 409
}
欲了解更多信息,请参阅下一个链接: 5 个 Serilog 最佳实践,实现更好的结构化日志记录