英文:
Add Username via LogContext in Serilog
问题
我正在.NET Core 6.0 Web API应用程序中使用Serilog进行日志记录。我想将已登录用户的用户名添加到日志中。我的中间件如下:
public class LogUserNameMiddleware
{
    private readonly RequestDelegate next;
    public LogUserNameMiddleware(RequestDelegate next)
    {
        this.next = next;
    }
    public Task Invoke(HttpContext context)
    {
        LogContext.PushProperty("UserName", context.User.Identity.Name);
        return next(context);
    }
}
在Program.cs中:
var _logger = new LoggerConfiguration()
    .ReadFrom.Configuration(builder.Configuration)    
    .MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Warning)
    .Enrich.FromLogContext()
    .CreateLogger();
Log.Logger = _logger;
builder.Logging.ClearProviders();
builder.Logging.AddSerilog(_logger);
以及在appsettings中:
"Serilog": {
    "MinimumLevel": {
        "Default": "Information",
        "Override": {
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Information"
        }
    },
    "WriteTo": [
        {
            "Name": "File",
            "Args": {
                "path": "C:\\Debug\\webapi-.log",
                "rollingInterval": "Day",
                "outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss} {CorrelationId} {Level:u3}] {Username} {Message:lj}{NewLine}{Exception}"
            }
        }
    ]
}
但是用户名称未写入日志。我可以在中间件中看到用户名,但在日志中看不到。我漏掉了什么?
注意:请确保Serilog的版本和配置正确,并且确保在中间件中正确设置了用户名属性。
英文:
I am using Serilog for logging in .NET Core 6.0 Web API application. I want to add logged user name to logs. My middleware is
public class LogUserNameMiddleware
{
    private readonly RequestDelegate next;
    public LogUserNameMiddleware(RequestDelegate next)
    {
        this.next = next;
    }
    public Task Invoke(HttpContext context)
    {
        LogContext.PushProperty("UserName", context.User.Identity.Name);
        return next(context);
    }
}
and in Program.cs
var _logger = new LoggerConfiguration()
 .ReadFrom.Configuration(builder.Configuration)    
 .MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Warning)
 .Enrich.FromLogContext()
 .CreateLogger();
Log.Logger = _logger; //new 
builder.Logging.ClearProviders();
builder.Logging.AddSerilog(_logger);
and in appsettings
 "Serilog": {
"MinimumLevel": {
  "Default": "Information",
  "Override": {
    "Microsoft": "Warning",
    "Microsoft.Hosting.Lifetime": "Information"
  }
},
"WriteTo": [
  {
    "Name": "File",
    "Args": {
      "path": "C:\\Debug\\webapi-.log",
      "rollingInterval": "Day",
      "outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss} {CorrelationId} {Level:u3}] {Username} {Message:lj}{NewLine}{Exception}"
    }
  }
]
But User name is not writing in logs. I can see user name in middleware but not in logs. What am I missing here?
答案1
得分: 0
属性名称区分大小写,您正在推送 UserName,但模板中使用的是 {Username}。统一名称,同时您可能希望在 PushProperty 前后包装使用:
public async Task Invoke(HttpContext context)
{
    using (LogContext.PushProperty("Username", context.User.Identity.Name))
    {
        await next(context);
    }
}
英文:
Property names a case-sensitive, you are pushing UserName but template has {Username}. Consolidate names, also you might want to wrap the PushProperty in using:
public async Task Invoke(HttpContext context)
{
    using (LogContext.PushProperty("Username", context.User.Identity.Name))
    {
        await next(context);
    }
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论