如何使用 Serilog 将用户信息保留在日志中

问题描述 投票:0回答:1

我正在尝试使用 .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、名称等?我应该创建一个中间件吗?

c# asp.net-mvc model-view-controller serilog serilog-sinks-file
1个回答
0
投票

您可以编写自定义中间件来实现这一点。 首先在 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 最佳实践,实现更好的结构化日志记录

© www.soinside.com 2019 - 2024. All rights reserved.